补充泛型类

弗洛里安·迪茨

我有两个抽象类:Container、Node

一种Container总是会包含同一种Node,一种Node只属于它对应的容器: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>

测试用例:

https://ideone.com/wam0gi

这背后的目的:

有许多不同类型的节点以及它们可以交互的多种不同方式。然而,它们有一些共同的主题。Container 和 Node 应该是抽象类,我可以在其中定义方法和抽象方法来定义这些公共主题。ContainerA 和 NodeA 将一起定义一种特定的交互方法。我为此使用泛型,因为如果我的 IDE 足够聪明,知道 ContainerA 中的任何节点始终是 NodeA,并且 NodeA 的所有者始终是 ContainerA,那么编程会变得容易得多,因此我可以避免一些不必要的类型转换.

(注意:这个问题类似但不等于Complementary generic types

法官精神

除了几个小错误(abstract应该class在 java之前,第 16 行L构造函数中的错误类型变量Node,尝试访问第 18 行的私有字段)之外,您的语义问题在第 18 行。类型为thisis Node<C,N>, not N

实现目标的一种方法是添加一个Node返回的抽象方法N,所有子类都将通过返回来实现它this

abstract protected N me();

然后,一旦您向 中添加了适当的 setter Container,您将第 18 行更改为

owner.add( me() );

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章