是否可以编写一个返回T类对象的方法?

时间:2008-12-11 22:37:15

标签: java generics

如果我有一个基类

public abstract class XMLSubscription <T extends XMLMessage>

是否可以在XMLSubscription中编写一个返回T?

的类对象的方法

我想出的唯一可能的解决方案是让XMLSubscription的每个后代都有一个类似的方法:

public class XMLStatusSubscription extends XMLSubscription<XMLStatusMessage>
{
   public Class <XMLStatusMessage> getExpectedMessageType()
   {        
     return XMLStatusMessage.class;
   }
}

2 个答案:

答案 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”方法。