2012-11-24 157 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

谢谢你们,我真的明白了) –

相关问题