【问题标题】:Extend from Generic Supertype?从通用超类型扩展?
【发布时间】:2011-01-01 07:27:26
【问题描述】:

在 Java 中,我可以从泛型超类型扩展吗?根据这篇文章,看起来我应该能够:http://www.ibm.com/developerworks/java/library/j-djc05133.html

public abstract class MyClass<T> extends T {

但是,当我在我的应用程序中执行类似操作时,我收到以下错误:“无法将类型参数 T 引用为超类型。”

有谁知道我是否能够从 Java 中的泛型超类型进行扩展?如果是这样,是否需要一些特殊的东西来实现这一点?

编辑:我读错了这篇文章。它实际上是在讨论这方面的潜在问题。

【问题讨论】:

  • 您能否向我们展示您代码中的声明...听起来您只是使用了错误的语法。

标签: java design-patterns generics inheritance


【解决方案1】:

能够从具有泛型类型参数的超类型继承。例如:

public class MyList<T> extends AbstractList<T>

(甚至给出参数范围,例如):

public class MyStringList extends AbstractList<String>

无法定义具有通配符超类型的类。这样的概念在 Java 中没有任何意义(而且我不相信它在抽象中具有很大的价值)。在您的 MonitoredDevice 示例中,我什至不确定您期望那里有什么功能。

由于擦除,这在 Java 工作方式的基本层面上根本不可能。每个类都必须有一个超类——MonitoredDevice 的超类是什么? MonitoredDevice 对象有哪些方法可用?您将无法在此类上调用任何继承的方法,因为编译器无法保证此类方法存在,字节码也无法表示此类调用。

我怀疑使用dynamic proxies 可以更好地实现您想要做的事情。

编辑:好的,在完整阅读这篇文章之后,我可以看到这样一个声明背后的动机是什么。但是读完这篇文章,你也意识到目前 Java 并不支持这个。根本原因是由于擦除;在当前的机制下,这种技术永远不可能实现,本文详细介绍了具体阻止这种技术发挥作用的原因。

【讨论】:

  • 这对我来说很有意义。我只是希望能够动态指定类的父类型;似乎我应该能够使用泛型来做到这一点。但是,我绝不是高级 Java 程序员,也不知道 Java 语言的底层细节。我将研究动态代理。谢谢。编辑:在您上次编辑之前写下此评论。 ;)
【解决方案2】:

从该错误消息看来,您正在尝试从类型参数本身进行扩展,但您无法这样做,因为该类型在运行时被擦除。如果这不是您想要做的,请发布您的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多