我已经迷路于通the丛林,请帮我:)我有这样的事情:
public class BaseClass<TYPE> { public BaseClass(Class<TYPE> clazz) {}; } public class FirstLevelClass<REFRESHABLE extends RefreshableInterface> extends BaseClass<REFRESHABLE> { public FirstLevelClass(Class<REFRESHABLE> clazz) { super(clazz); }; } public class Argument<T extends AnyOtherClass> implements RefreshableInterface { public refresh() {} } pulbic class ProblematicClass extends FirstLevelClass<Argument<AnyOtherClassDescendant>> { public ProblematicClass() { //Compiler error: Constructor //FirstLevelClass<Argument<AnyOtherClassDescendant>>(Class<Argument>) is undefined super(Argument.class); } }
据我所知,编译器应该接受参数,因为它实现了RefreshableInterface.
>为什么我得到这个错误?
>如何使问题类工作?
ps:如果你有更好的标题,请改变它.我不能弥补更好.
解决方法
问题是,您的构造函数期望Class< T>,并且您的代码中的T被推断为Argument< AnyOtherClassDescendant>.
所以,你应该传递一个Class< Argument< AnyOtherClassDescendant>>,你正在传递Class&Argument>.但是您不能直接传递该类实例,因为您无法执行Argument< AnyOtherClassDescendant> .class.
但是,您可以通过将类类型转换为所需实例来解决问题:
public ProblematicClass() { super((Class<Argument<AnyOtherClassDescendant>>)(Class<?>)Argument.class); }
注意,你如何打字类< Argument>首先到Class<>,然后将结果类型分类到Class< Argument< AnyOtherClassDescendant>>.没有简单的方法来实现这一点.
这样做的原因是,对于通用类型的所有参数化实例化只有一个Class实例,它与类本身相关联.通用类型的单个编译单元,仅编译为单个类文件.我猜这个C实现模板是不同的.您可以在不同的实例中获得不同的机器代码.
List<String> strList = new ArrayList<String>(); List<Integer> intList = new ArrayList<Integer>(); boolean isSameClassInstance = strList.getClass() == intList.getClass(); System.out.println(isSameClassInstance);