2011-12-18 27 views
0

关于Class及其泛型语义的一个简单问题。为什么没有下面的代码工作?作为泛型的Java Class类不能按预期工作

Class<Serializable> s = String.class; 

的Java告诉我,Class<Serializable>Class<String>是不相容的。当String正在实施Serializable时,他们怎么可能?

不应该泛型允许这种类型的东西吗?

回答

3

因为Class<String>不是Class<Serializable>。但是Class<String>Class<? extends Serializable>

+0

哦,我不知道'?extends'语义。谢谢! – 2011-12-18 03:45:40

3

不,没有,泛型明确不要允许这种事情。经典的例子是某种集合类。如果ArrayList<String>是的ArrayList<Serializable>一个子类,那么你可以写

ArrayList<String> astr = new ArrayList<String>(); 
ArrayList<Serializable> aser = astr; 
aser.add(new Integer()); 
// This will throw ClassCastException! 
String str = astr.get(0); 

此代码后,你有一个ArrayList <字符串>()含有Integer对象 - 显然这是不好的。