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



想象这个类:

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);
    }
}

构造函数ObjectCreator<Message<String>>(Class<Message>)是undefined MessageCreator.java

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

你知道怎么解决吗?

马西莫

试试这个:

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

如果你把基类的构造函数改成

那就更好了
public ObjectCreator(Class<? extends T> persistentClass)

,然后在派生类中使用:

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

编译时没有警告

编辑

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

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

对于泛型类,没有'.class'变体-在运行时无法获得该信息,但是为了使上述代码编译,您可以简单地将表达式强制转换为所需的类型。

super ((Class<Message<String>>)((Class<?>)Message.class));

请注意,这也不会使信息在运行时可用(即用于反射等),但是它应该编译一个未检查的警告-这只是一个警告。

只要使用

就可以了
public class MessageCreator extends ObjectCreator<Message>{
    /**
     * @param persistentClass
     */
    public MessageCreator() {
        super(Message.class);
    }
}

这将创建正确的对象,但仍然会给类定义一个警告,如果你这样做

Message<String> m = creator.create();

最新更新