Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:继承泛型类型_Java_Generics - Fatal编程技术网

Java:继承泛型类型

Java:继承泛型类型,java,generics,Java,Generics,可能重复: 大家好。 我来自C++,我喜欢用模板工作。 在Java中,我希望在某个特定点将节点“插入”到继承树中。 ... 我认为代码应该更加明确: public class MyClass<E> extends E {} 公共类MyClass扩展了E{} 它将用C++模板工作,但java给了我一个“不能重命名为超级类型的参数”。在java中有没有一种方法可以做到这一点 谢谢你的帮助;)整数< /COD>?< /P> 可以对包含常规数据的节点执行任何操作: public cla

可能重复:

大家好。 我来自C++,我喜欢用模板工作。 在Java中,我希望在某个特定点将节点“插入”到继承树中。 ... 我认为代码应该更加明确:

public class MyClass<E> extends E {}
公共类MyClass扩展了E{}
<>它将用C++模板工作,但java给了我一个“不能重命名为超级类型的参数”。在java中有没有一种方法可以做到这一点


谢谢你的帮助;) e <代码>是什么,比如说,代码>整数< /COD>?< /P> 可以对包含常规数据的节点执行任何操作:

public class Node<T> {
    T data;
    // other tree bookkeeping fields
}
公共类节点{
T数据;
//其他树木簿记领域
}
然后可以定义子类:

public class ThreadedTreeNode<T> extends Node<T> {
    // even more bookkeeping fields
}
公共类ThreadedTreeNode扩展节点{
//甚至更多的簿记领域
}

泛型不是C++模板。这些概念没有任何有用的兼容性。如果你不尽快把这两个想法分开,你将陷入一个充满挫折和警告的世界。Java中泛型的唯一目的是防止ClassCastException。如果父类的泛型类型T扩展了某些内容(可序列化、可比较……),那么子类也应该这样做。。。例如:
class-ThreadedTreeNode扩展节点
,其中
类节点
我看不出
整数
有问题-除此之外,
整数
是最终的。这似乎不是一个问题的建设,只是你的类型选择。它只是意味着不能将
final
类用于
E
。诚然,为了清楚起见,Java可能需要一种方式将其表示为类型参数的绑定,但这本身并不是问题,只是令人讨厌。类型参数不能用作超类还有更根本的原因吗?@Erhannis-还有其他各种各样的问题。基本上,如果您不知道超类,编译器就不知道方法声明在子类中是否合法。(结果可能是超类的
final
方法被重写了。)当绑定泛型类型时,检查所有这些突然成为编译器的一个指数级难题。这只是我脑海中的一个例子。在子类中,什么是
super
?当超类未知时,编译器应该如何为类似的内容生成字节码?@TedHopp我想这是公平类型擦除,与实际编译代码有点冲突。无论这个问题在逻辑上是否不可调和,我承认,允许存在问题的构造将使许多事情变得非常复杂,而且无论如何也很少有用。