Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的类对象类型参数化_Java_Generics_Reflection - Fatal编程技术网

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;
  }
}