将参数化的Class实例传递给构造函数

我迷失在仿制药丛林中,请帮助我:)我有这样的事情:

public class BaseClass { public BaseClass(Class clazz) {}; } public class FirstLevelClass extends BaseClass { public FirstLevelClass(Class clazz) { super(clazz); }; } public class Argument implements RefreshableInterface { public refresh() {} } pulbic class ProblematicClass extends FirstLevelClass<Argument> { public ProblematicClass() { //Compiler error: Constructor //FirstLevelClass<Argument>(Class) is undefined super(Argument.class); } } 

据我所知,编译器应该接受Argument因为它实现了RefreshableInterface

  • 为什么我会收到此错误?
  • 如何使ProblematicClass工作?

ps:如果你有更好的头衔,请改变它。 我无法弥补。

问题是,您的构造函数需要Class ,并且代码中的T被推断为Argument

因此,您应该传递一个Class> ,然后传递Class 。 但是你不能直接传递那个Class实例,因为你不能做Argument.class

但是,您可以通过将类类型转换为必需的实例来解决问题:

 public ProblematicClass() { super((Class>)(Class)Argument.class); } 

注意,如何将Class首先类型Class> Class ,然后将结果类型类型Class> 。 没有简单的方法可以实现这一目标。

这背后的原因是,generics类型的所有参数化实例化只有一个Class实例,它与类本身相关联。 generics类型的单个编译单元,仅编译为单个类文件。 我猜这与C ++实现模板的方式不同。 在那里,您可以获得不同实例化的不同机器代码。

因此,如果您执行以下代码,您将获得输出:

 List strList = new ArrayList(); List intList = new ArrayList(); boolean isSameClassInstance = strList.getClass() == intList.getClass(); System.out.println(isSameClassInstance);