问题是,您的构造函数需要一个
Class<T>,并且
T在您的代码中将其推断为
Argument<AnyOtherClassDescendant>。
因此,您应该通过
Class<Argument<AnyOtherClassDescendant>>,然后通过
Class<Argument>。但是您不能像那样
Class直接传递该实例
Argument<AnyOtherClassDescendant>.class。
但是,您可以通过将类强制转换为所需实例来解决此问题:
public ProblematicClass() { super((Class<Argument<AnyOtherClassDescendant>>)(Class<?>)Argument.class); }请注意,如何首先将转换
Class<Argument>为
Class<?>,然后将最终的类型转换为
Class<Argument<AnyOtherClassDescendant>>。没有简单的方法可以做到这一点。
其背后的原因是,
Class与类本身相关联的泛型类型的所有参数化实例只有一个实例。通用类型的单个编译单元仅编译为单个类文件。我想这与C
++实施模板的方式不同。在那里,您将获得用于不同实例化的不同机器代码。
因此,如果执行以下代码,则将得到
true输出:
List<String> strList = new ArrayList<String>();List<Integer> intList = new ArrayList<Integer>();boolean isSameClassInstance = strList.getClass() == intList.getClass();System.out.println(isSameClassInstance);



