想象一下这堂课:
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
我认为这是一个很大的限制:为什么禁止这样做?
任何想法如何解决?
马西莫
尝试这个:
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>(){}
归档时间: |
|
查看次数: |
4634 次 |
最近记录: |