Java中的类对象类型参数化
假设以下对象结构:Java中的类对象类型参数化,java,generics,reflection,Java,Generics,Reflection,假设以下对象结构: class Super {} class SubA extends Super {} class SubB extends Super {} 我希望能够有一个变量来保存我的任何一个子类的类对象。我觉得应该这样做: Class<Super> classObj; 或: 但这不起作用。我得到以下错误: Type mismatch: cannot convert from Class<SubA> to Class<Super> 类型不匹配:
class Super {}
class SubA extends Super {}
class SubB extends Super {}
我希望能够有一个变量来保存我的任何一个子类的类对象。我觉得应该这样做:
Class<Super> classObj;
或:
但这不起作用。我得到以下错误:
Type mismatch: cannot convert from Class<SubA> to Class<Super>
类型不匹配:无法从一个类转换到另一个类
你知道为什么吗?我需要修复什么?您需要一个有界通配符:
Class正如mmyers指出的,您可以使用通配符
或者,您可以让类实现一个公共接口,然后通过该接口访问它们 试试这个(编译失败):
公共类ListCopy{
公共静态void main(字符串[]args){
List stringList=新建ArrayList();
List objectList=stringList;
}
}
即使字符串扩展了对象,也无法编译。Java内容不是协变的-类型参数被擦除,因此编译器不知道在运行时会出现什么
上课也是一样。别介意我;我只是(粗略地)记录了拼错我名字的人的总数。我一个月前才开始工作,现在已经17岁了。其中之一是杰夫·阿特伍德——我几乎有点出名了!啊,对不起,情况已经纠正了。没问题;我现在已经习惯了。(我哥哥有一次收到一封写给他的信,只是他们把他的三个名字都拼错了。他最终克服了这一点。)你需要存储变量而不是在需要时使用getClass()有什么原因吗?原因是我在工厂中使用枚举类型。工厂方法获取一个枚举,并实例化相应的类。enum中还存储了其他东西,所以至少对我来说这是有意义的。
classObj = SubB.class;
Type mismatch: cannot convert from Class<SubA> to Class<Super>
Class<? extends Super> classObj;
public class ListCopy {
public static void main(String[] args) {
List<String> stringList = new ArrayList<String>();
List<Object> objectList = stringList;
}
}