【问题标题】:Java : inherits a generic type [duplicate]Java:继承泛型类型[重复]
【发布时间】:2011-08-17 02:43:36
【问题描述】:

可能重复:
Extend from Generic Supertype?

大家好。 我来自 C++,我喜欢使用模板。 我想在 Java 中将一个节点“插入”到特定点的继承树中。 ...我认为代码会更明确:

public class MyClass<E> extends E {}

它适用于 C++ 模板,但 java 给了我一个“不能将类型参数引用为超类型”。有没有办法在java中做到这一点?

感谢您的帮助;)

【问题讨论】:

  • Java 泛型不是 C++ 模板。这些概念没有任何有用的兼容。如果您不尽快将这两个想法分开,您将陷入沮丧和编译器警告的世界。 Java 中泛型的唯一目的是防止 ClassCastException。

标签: java generics


【解决方案1】:

要了解您尝试的代码的问题,请考虑如果 E 是 Integer 会发生什么?

你可以对包含通用数据的节点做你想做的事:

public class Node<T> {
    T data;
    // other tree bookkeeping fields
}

然后你可以定义子类:

public class ThreadedTreeNode<T> extends Node<T> {
    // even more bookkeeping fields
}

【讨论】:

  • 如果你的父类的泛型 Type T 扩展了某些东西(Serializable、Comparable、...),那么孩子们也应该这样做...例如:class ThreadedTreeNode&lt;T extends Comparable&gt; extends Node&lt;T&gt; where class Node&lt;T extends Comparable&gt;
  • 我认为Integer 没有问题——除了Integer 是最终的。这似乎不是结构的问题,只是您选择的类型。这只是意味着您不能将final 类用于E。诚然,为了清楚起见,Java 可能需要一种方法将其表示为类型参数的绑定,但这本身并不是真正的问题,只是令人讨厌。类型参数不能用作超类有更根本的原因吗?
  • @Erhannis - 还有各种各样的其他问题。基本上,如果你不知道超类,编译器不知道方法声明在子类中是否合法。 (结果可能是超类的 final 方法被覆盖了。)当绑定泛型类型突然变成编译器的指数级难题时,检查所有这些。这只是我脑海中的一个例子。在子类中,super 是什么?当超类未知时,编译器应该如何为类似的东西生成字节码?
  • @TedHopp 我想这很公平 - 类型擦除会与实际编译您的代码发生冲突。不管这个问题在逻辑上是否不可调和,我承认允许有问题的构造会使许多事情变得非常复杂,而且无论如何也很少有用。
猜你喜欢
  • 2011-08-19
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 2018-09-27
  • 2015-09-15
  • 1970-01-01
相关资源
最近更新 更多