如果我有一个基类
public abstract class XMLSubscription <T extends XMLMessage>
是否可以在XMLSubscription中编写一个返回T?
的类对象的方法我想出的唯一可能的解决方案是让XMLSubscription的每个后代都有一个类似的方法:
public class XMLStatusSubscription extends XMLSubscription<XMLStatusMessage>
{
public Class <XMLStatusMessage> getExpectedMessageType()
{
return XMLStatusMessage.class;
}
}
答案 0 :(得分:4)
不幸的是 - 是的,这是由于类型擦除 - 没有办法在运行时以某种方式提供Class
对象。
幸运的是,这通常不太困难。以下是我通常完成此操作/看到它的完成情况:
public abstract class XMLSubscription <T extends XMLMessage> {
private Class<T> messageType;
protected XMLSubscription(Class<T> messageType) {
this.messageType = messageType;
}
public Class<T> getExpectedMessageType() {
return this.messageType;
}
}
public class XMLStatusSubscription extends XMLSubscription<XMLStatusMessage> {
public XMLStatusSubscription() {
super(XMLStatusMessage.class);
}
}
答案 1 :(得分:0)
正如您猜测的那样,编译器会删除T.当您实例化对象时,它不知道它应该处理 XMLStatusMessage 对象。您的基类将定义以下模板方法,1.5的协变返回类型将使编译器对具体子类感到满意:
public Class<T> getExpectedMessageType()
有一个元评论:这看起来很像程序代码,其中某些东西调用 getExpectedMessageType(),然后根据返回类型采取行动。使用访问者模式可以更好地实现这一点,访问者为 XMLMessage 的每个子类实现“doSomething”方法。