从Generic Supertype扩展?

时间:2010-01-04 16:13:22

标签: java design-patterns generics inheritance

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

public abstract class MyClass<T> extends T {

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

有没有人知道我是否可以从Java中的通用超类型扩展?而且,如果是这样,是否需要特别的东西才能实现这一目标?

编辑:我读错了文章。它实际上正在讨论这个潜在的问题。

2 个答案:

答案 0 :(得分:10)

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

public class MyList<T> extends AbstractList<T>

(或甚至给出参数界限,例如):

public class MyStringList extends AbstractList<String>

能够定义具有通配符超类型的类。这样的概念在Java中没有任何意义(我不相信它在摘要中有很多价值)。在您的MonitoredDevice示例中,我甚至不确定您期望的功能。

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

我怀疑使用dynamic proxies可以更好地实现您的目标。

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

答案 1 :(得分:3)

从错误消息中可以看出,您正试图从类型参数本身进行扩展,这是您无法做到的,因为类型在运行时被删除。如果这不是您要做的,请发布您的代码。