加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:57:45 所属栏目:Java 来源:网络整理
导读:我已经迷路于通the丛林,请帮我:)我有这样的事情: public class BaseClassTYPE { public BaseClass(ClassTYPE clazz) {};}public class FirstLevelClassREFRESHABLE extends RefreshableInterface extends BaseClassREFRESHABLE { public FirstLevelClass(Cl
我已经迷路于通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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读