M. *_*sup 17 java generics crtp circular-reference
我正在编写一个应用程序来在对等网络中进行一些分布式计算.在定义网络时,我有两类P2PNetwork和P2PClient.我希望这些是通用的,因此有以下定义:
P2PNetwork<T extends P2PClient<? extends P2PNetwork<T>>>
P2PClient<T extends P2PNetwork<? extends T>>
Run Code Online (Sandbox Code Playgroud)
用P2PClient定义setNetwork(T网络)的方法.我希望用这段代码描述的是:
这似乎对我来说是正确的,但如果我尝试创建一个非泛型版本,如
MyP2PClient<MyP2PNetwork<? extends MyP2PClient>> myClient;
Run Code Online (Sandbox Code Playgroud)
和其他变种我从编译器收到很多错误.所以我的问题如下:
Pét*_*rök 25
圆形通用引用确实是可能的.Java Generics和Collections包含几个示例.对于您的情况,这样的样本看起来像这样:
public interface P2PNetwork<N extends P2PNetwork<N, C>,
C extends P2PClient<N, C>> {
void addClient(C client);
}
public interface P2PClient<N extends P2PNetwork<N, C>,
C extends P2PClient<N, C>> {
void setNetwork(N network);
}
class TorrentNetwork implements P2PNetwork<TorrentNetwork, TorrentClient> {
@Override
public void addClient(TorrentClient client) {
...
}
}
class TorrentClient implements P2PClient<TorrentNetwork, TorrentClient> {
@Override
public void setNetwork(TorrentNetwork network) {
...
}
}
...
TorrentNetwork network = new TorrentNetwork();
TorrentClient client = new TorrentClient();
network.addClient(client);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3069 次 |
| 最近记录: |