通用构造函数(Class <T> clazz)不支持T,其中T是另一个泛型

Mas*_*ues 7 java generics

想象一下这堂课:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public class PersonCreator extends ObjectCreator<Person>{

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

    }

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

构造函数ObjectCreator<Message<String>>(Class<Message>)是未定义的MessageCreator.java

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

任何想法如何解决?

马西莫

Dmi*_*sev 3

尝试这个:

super((Class<Message<String>>) ((Object) Message.class)); //compiles with warning
Run Code Online (Sandbox Code Playgroud)

如果将基类的构造函数更改为

public ObjectCreator(Class<? extends T> persistentClass)
Run Code Online (Sandbox Code Playgroud)

然后在派生类中使用它:

super(new Message<String>(){}.getClass()); //compiles without warning
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

返回Class<? extends X>,其中 X 是调用 getClass 的表达式的静态类型的擦除。这意味着getClass()Class<? extends Message>返回new Message<String>()匿名Class<? extends Message<String>>new Message<String>(){}