2012-11-24 156 views
0

爲什麼我不能classcastexception? E在這個例子中是指C,不是嗎? B不是C,我認爲我的演員必須爲編譯器工作。 我的錯誤在哪裏?爲什麼我不能classcastexception?

public class A{ 
public static void main(String...s){ 
    Monitor<C> m = new Monitor<C>(); 
    C arg2 = new C(); 
    B d = m.f(arg2); 
    System.out.println(d); 
    } 
} 
class B extends A{} 
class C extends B{} 
class Monitor<E extends B>{ 
public E f(E E){ 
    return (E) new B();//Why this place didn't give me ClassCastException? 
} 
} 
+0

請清理你的源代碼,它看起來很可怕。請儘量清楚問題,這很難理解。 – Polygnome

+0

爲什麼獨立監控?爲什麼不是M – vels4j

回答

0

這是因爲在泛型類型擦除。既然你有泛型類型<E extends B>陳述return (E) new B()編譯成return (B) new B()所以你還沒有ClassCastException

+0

要實現泛型,Java編譯器將類型擦除應用於: 如果類型參數是無界的,則將泛型類型中的所有類型參數替換爲它們的範圍或對象。因此,生成的字節碼只包含普通的類,接口和方法。我的約束是(B),不是嗎?也許那麼,我會有(B)新的B? –

+0

@ user1849430是的。你是對的。 – bellum

+0

謝謝你們,我真的明白了) –

相關問題