【发布时间】:2010-04-02 15:49:51
【问题描述】:
我正在编写一个应用程序来在对等网络中进行一些分布式计算。在定义网络时,我有两类 P2PNetwork 和 P2PClient。我希望这些是通用的,因此具有以下定义:
P2PNetwork<T extends P2PClient<? extends P2PNetwork<T>>>
P2PClient<T extends P2PNetwork<? extends T>>
使用 P2PClient 定义 setNetwork(T network) 的方法。我希望用这段代码描述的是:
- 一个 P2PNetwork 由 特定类型的客户
- 一个 P2PClient 可能只属于一个 其客户端包括的网络 与此客户端相同的类型( 循环引用)
这对我来说似乎是正确的,但如果我尝试创建一个非通用版本,例如
MyP2PClient<MyP2PNetwork<? extends MyP2PClient>> myClient;
和其他变体我从编译器收到大量错误。所以我的问题如下:
- 甚至是通用循环引用 可能(我从未见过任何明确禁止它的东西)?
- 上面的通用定义是不是 这样一个通告的正确定义 关系?
- 如果有效,是否“正确” 描述这种关系的方式 (即是否有另一个有效的 定义,在风格上 首选)?
- 如何正确定义 客户端的非泛型实例和 服务器给出了适当的泛型 定义?
【问题讨论】:
-
我仍然无法找到关于“是否可能”的明确答案,但是通过进一步阅读和尝试,我相信可以创建定义,但不能使用它来实例化对象。
标签: java generics circular-reference crtp