java – 将参数化的Class实例传递给构造函数
|
我已经迷路于通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实现模板是不同的.您可以在不同的实例中获得不同的机器代码. 所以,如果你执行下面的代码,你会得到true作为输出: List<String> strList = new ArrayList<String>(); List<Integer> intList = new ArrayList<Integer>(); boolean isSameClassInstance = strList.getClass() == intList.getClass(); System.out.println(isSameClassInstance); (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java-ee – 在maven-embedded-glassfish-plugin上的CDI注入
- java-带@EnableWebFlux批注的SpringWebFlux错误
- java – 命名EJB的本地/远程接口时的标准约定或良好实践?
- Java xml出现错误 javax.xml.transform.TransformerExcepti
- java – 将SimpleDateFormat转换为DateTimeFormatter
- java八大经典书籍 你看过几本?
- Java独立变量vs数组性能
- java – 多个JVM与并发任务
- java – 从另一个类完成一个活动
- Android TextView字体滚动效果
