2013-05-05 105 views
-1

基本上嘗試下面的代碼片段,我得到一個ClassCastException:爲什麼在使用Long而不是Integer時會出現ClassCastException?

public static void main (String []args)  
{ 
    Path path = Paths.get((System.getProperty("user.home")), "Desktop","usnumbers.txt"); 
    try {  
    Integer size = (Integer)Files.getAttribute(path, "basic:size", NOFOLLOW_LINKS); 
    System.out.println("Size: " + size.toString()); 
    } catch (IOException e) { 
    System.err.println(e); 
    } 
} 
} 

它被固定,一旦我更改關鍵字IntegerLong。我檢查了文檔Files.getAttribute(...),它返回一個Object not long。此外,總是在同一頁面中,在解釋此方法的用法時,它們實際上使用Integer關鍵字來投射對象。 Here是正式的oracle文檔解釋它的鏈接。 直接從相同的鏈接的方法的使用:

用法示例:假設我們需要支持一個「UNIX」視圖 系統上的文件所有者的用戶ID:

Path path = ... 
int uid = (Integer)Files.getAttribute(path, "unix:uid"); 

回答

2

Files.getAttribute實際返回類型取決於屬性,因此對於「unix:uid」,返回Integer,但對於「basic:size」,返回Long。你不能將Long轉換爲Integer,反之亦然。

0

嘗試,而不是

Long size = (Long) Files.getAttribute(path, "basic:size", NOFOLLOW_LINKS); 
System.out.println("Size: " + size); 

不能使用鑄造類型的引用的轉換在Java中。這意味着雖然你可以投longint,但是你不能投LongInteger

0

該類型轉換失敗,因爲返回的屬性值不是Integer

getAttribute(...)返回的屬性的名稱和類型在各自的AttributeView類的javadoc中指定。在這種情況下,javadoc爲BasicFileAttributeView指出sizeLong而不是Integer

(這是有道理的,因爲文件的大小可以比Integer.MAX_VALUE更大。)


的教訓:不要只是讀的例子。您還需要閱讀並理解其他文檔。

相關問題