2013-10-30 58 views
0

我已經搜索到了這一點,但仍然存在混淆。無法理解在Java中的用戶定義的類和標準類中的Casting差異

下面是示例Standered類

public class Q { 
    public static void main(String... str){ 
    Number b = 10; 
    Integer i = (Integer)b; // Workes Fine 
    }   
} 

的鑄造的下面是示例性用戶定義的類

class H{} 

class I extends H{} 

public class Q extends I{ 
    public static void main(String... str){ 
    I i = (I)new H(); //Show runtime java.lang.ClassCastException 
    }   
} 

的鑄造的上面是繼承的例子。這樣的:

  1. 整數擴展號碼
  2. 我延長^ h

爲什麼整數i =(整數)B工作和我I =(I)新的H()不?

+0

這是一個可愛的小教程,以幫助你明白你正在嘗試做的:http://forum.codecall.net/topic/50451-upcasting-向下轉換/ –

回答

4

由於new H()創建H類的一個對象,它是既不I也不I子類所以它不能被轉換爲I

雖然Numberb在第一示例一個Integer - 有隱式new Integer(10)那裏(Number是一個抽象類),因此它可以顯然可以轉換爲Integer

1
Number b = 10; 
Integer i = (Integer)b; // Workes Fine 

在這種情況下,你告訴java編譯器相信我b是一個整數(在運行時),它實際上是(10是一個整數)。

I i = (I)new H(); //Show runtime java.lang.ClassCastException 

你告訴編譯器H是我這是不正確的(同動物不是狗)。

0

b = 10;與Number b = new Integer相同(10)Integer是Number的子類。雖然在你的例子中H不是我的子類

1

沒有Inew H()所以你需要創建我然後只有你可以投。

試試這個。

H h = new I(); 
    I i = (I)h; 
1

爲什麼整數i =(整數)B工作

因爲語句Number b = 10;隱式轉換爲Number b = new Integer(10);因此上述鑄造工作正常這工作得很好。

如果你想測試這一點,只是嘗試下面的代碼:

Number n = 12342444444; // Wont compile: Expects the literal to in the range of int 
Integer i = (Integer) n; 

默認分配給數參考值被視爲int類型。 如果您將該值分配爲long,上面的代碼將被編譯。

Number n = 12342444444L; // Will compile 
Integer i = (Integer) n; // ClassCastExcpetion: Cannot cast Long to Integer 
1

如果是第一次。

Number b = 10; 
Integer i = (Integer)b; // Workes Fine 

它更像

Number b = new Integer(10); // because 10 in int and it autobox to Integer. 
Integer i = (Integer)b; 

但在另一方面。

I i = (I)new H(); //Show runtime java.lang.ClassCastException 

它創建H類的對象,並嘗試將其轉換爲I,但H不是我的子類,所以它不能被轉換爲一


所以,如果你想第2一個爲等於1一個使用下面的代碼:

H h = new I();