想象一下这堂课:
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>(){}