【问题标题】:Is it possible to write a method that returns a class object of T?是否可以编写一个返回 T 的类对象的方法?
【发布时间】:2008-12-11 22:37:15
【问题描述】:

如果我有这样的基类

public abstract class XMLSubscription <T extends XMLMessage>

是否可以在 XMLSubscription 中编写返回 T 的类对象的方法?

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

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

【问题讨论】:

  • 您能否修改您的问题标题以更反映您的一般问题?就像,你能指定一个扩展类的泛型类型,或者......类似的东西吗?您的问题标题不会帮助搜索类似内容的人。
  • 可能是“我可以返回 Java Generic 的 Class 类型吗?”
  • 好建议,我想不出如何表达这个问题,谢谢!

标签: java generics


【解决方案1】:

不幸的是 - 是的,这是由于类型擦除 - 如果不以某种方式在运行时提供 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);
    }
}

【讨论】:

  • 太棒了!您的解决方案为我节省了一些代码和大量文档/说明!很好的解决方法!
【解决方案2】:

如您所料,编译器会删除 T。当您实例化对象时,它不知道它应该处理 XMLStatusMessage 对象。您的基类将定义以下模板方法,并且 1.5 的协变返回类型将使编译器对具体的子类感到满意:

public Class<T> getExpectedMessageType()

有一个元注释:这看起来很像程序代码,其中调用 getExpectedMessageType() 然后根据返回类型采取行动。使用访问者模式可能会更好地实现这一点,访问者为 XMLMessage 的每个子类实现“doSomething”方法。

【讨论】:

  • 为了提出这个问题,我不得不删掉很多代码并实际移动一些东西。实际代码确实实现了您推荐的访客模式。该类型实际上被传递到 Castor 方法中,以便它知道如何解组为 Java 对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多