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

java – Generic constructor(Class clazz)不支持T,其中T是另一

发布时间:2020-12-15 03:05:12 所属栏目:Java 来源:网络整理
导读:想象一下这堂课: public class ObjectCreatorT { private ClassT persistentClass; public ObjectCreator(ClassT persistentClass) { this.persistentClass = persistentClass; } public T create() { T instance = null; try { instance = persistentClass
想象一下这堂课:
public class ObjectCreator<T> {
    private Class<T> persistentClass;

    public ObjectCreator(Class<T> persistentClass) {
        this.persistentClass = persistentClass;
    }

    public T create() {
        T instance = null;
        try {
            instance = persistentClass.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        } 

        return instance;
    }
}

现在我用域对象对其进行子类化:

public class PersonCreator extends ObjectCreator<Person>{

    /**
     * @param persistentClass
     */
    public PersonCreator() {
        super(Person.class);

    }

}

一切都很棒……
但是,如果我尝试使用另一个通用域对象将其子类化,编译器会抱怨:

public class MessageCreator extends ObjectCreator<Message<String>>{

    /**
     * @param persistentClass
     */
    public MessageCreator() {
        super(Message.class);
    }

}

The constructor ObjectCreator<Message<String>>(Class<Message>) is undefined MessageCreator.java

我认为这是一个很大的限制:为什么这是禁止的?

任何想法如何解决?

马西莫

解决方法

试试这个:
super((Class<Message<String>>) ((Object) Message.class)); //compiles with warning

如果你将基类的构造函数更改为,那将会更好

public ObjectCreator(Class<? extends T> persistentClass)

然后在derrived类中使用它:

super(new Message<String>(){}.getClass()); //compiles without warning

它将在没有警告的情况下编译

编辑

根据getClass()http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#getClass()的定义

返回类<?扩展X>,其中X是调用getClass的表达式的静态类型的擦除.这意味着getClass()将返回Class<?扩展消息>对于新消息< String>()和Class<?扩展消息< String>>对于匿名类新消息< String>(){}

(编辑:李大同)

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

    推荐文章
      热点阅读