【发布时间】:2017-04-15 12:45:08
【问题描述】:
我有两个抽象类: 容器、节点
一种Container总会包含同一种Node,一种Node只会属于其对应的Container: NodeTypeA 存储在 ContainerTypeA 中,并且没有其他 Node 子类存储在其中。 NodeTypeB 存储在 ContainerTypeB 中,没有其他 Node 子类存储在其中。从 Node 到它的 Container 的反向引用也应该知道 Container 的类型,所以关系是双向的。
我在 Java 中实现这个时遇到问题。
我是这样做的:
Container<C extends Container<C,N>, N extends Node<C,N>>
Node<C extends Container<C,N>, N extends Node<C,N>>
但是,当我在 Container 中定义以下字段时,出现错误:
private List<N> nodes;
错误消息说我应该用 Node 替换 N。这对我来说似乎是多余的。为什么会发生这种情况,我怎样才能让程序理解这一点
N
应该等于
Node<C,N>
测试用例:
这样做的目的:
有许多不同种类的节点以及它们可以交互的许多不同种类的方式。但是,它们有一些共同的主题。 Container 和 Node 应该是抽象类,我可以在其中定义方法和抽象方法来定义这些常见的主题。 ContainerA 和 NodeA 将一起定义一种特定的交互方法。我为此使用泛型,因为如果我的 IDE 足够聪明,可以知道 ContainerA 中的任何节点始终是 NodeA,并且 NodeA 的所有者始终是 ContainerA,那么我可以避免一些不必要的类型转换.
(注:此题类似但不等于Complementary generic types)
【问题讨论】:
-
确切的错误信息是什么?您能否包含一个导致此错误的最小但完整的类?
-
这里看起来不错:ideone.com/m1Qi2n。请构造一个minimal test-case。
-
最小测试用例:ideone.com/wam0gi
-
关键字“abstract”应在关键字“class”之前。
-
嗯。我匆匆写下。奇怪的是网站的编译器没有首先抱怨这个,而只是抱怨泛型。
标签: java generics generic-programming