嵌套Java泛型类型

嵌套Java泛型类型,java,generics,Java,Generics,我正在尝试使用泛型实现一个图,我想为节点和节点内的数据使用泛型参数。如果我用第一种方法,它是有效的,但理想情况下,我想用第二种方法来定义它 为什么第二条路不行 //OK public class AdjacencyListGraph<E, N extends Node<E>> { } //Cannot resolve symbol E public class AdjacencyListGraph<N extends Node<E>> { }

我正在尝试使用泛型实现一个图,我想为节点和节点内的数据使用泛型参数。如果我用第一种方法,它是有效的,但理想情况下,我想用第二种方法来定义它

为什么第二条路不行

//OK
public class AdjacencyListGraph<E, N extends Node<E>> {
}

//Cannot resolve symbol E
public class AdjacencyListGraph<N extends Node<E>> {
}
//好的
公共类邻接柱状图{
}
//无法解析符号E
公共类邻接柱状图{
}

在java泛型的上下文中,一词扩展了的意思是上界,而不是继承。在泛型的情况下,这个词的意思是超负荷的

java中引入泛型是为了让开发人员能够编写比以前更一致、更干净、更少错误的代码。这都是关于发展,而不是执行。编译后的代码中没有泛型。然而,在元空间中有一些关于实际类型的信息,您可以通过反射来检索,但这是元信息,而不是实际代码

在编译过程中,泛型类型被擦除并替换为实际边界()。这是你问题的根本原因。如果提供的绑定也是泛型的,则编译器无法执行类型擦除。它只是不知道在编译过程中应该用哪种类型替换代码中的泛型类型。因此,您将得到编译错误

//OK
public class AdjacencyListGraph<E, N extends Node<E>> {
}
//好的
公共类邻接柱状图{
}
无论如何,这里您必须提供实际的类型E,因此编译器将能够解析实际绑定并执行类型擦除

//Cannot resolve symbol E
public class AdjacencyListGraph<N extends Node<E>> {
}
//无法解析符号E
公共类邻接柱状图{
}
在这种情况下,您的绑定也将变为泛型。编译器不知道实际的类型。它可以是任何类型。所以它不能在这里执行类型擦除,并给您一个编译错误

这里还有一些关于泛型的有用资源:


第一个真的很棒。以下是有关extends word及其在泛型上下文中的含义的信息:?

您希望如何在方法中使用类型参数?在内部,N在添加节点时是参数,在查询节点时是返回类型,E在哈希映射中映射节点并用于查询图。感谢您的精彩解释。这是未来可以作为泛型的一部分实现的东西,还是比我想象的更复杂?