5

ジェネリック引数に現在のクラスの型を使用する方法はありますか? たとえば、私はこのクラスを持っていますServiceNode

public final class ServiceNode<S extends NetworkService> {

    private final S service;
    private final Client client;
    private Object attachment;

    public ServiceNode(S service, Client client) {
        this (service, client, null);
    }

    public ServiceNode(S service, Client client, Object attachment) {
        this.service = service;
        this.client = client;
        this.attachment = attachment;
    }

    public S service() {
        return service;
    }

....

}

これは抽象クラスの一部ですNetworkService

public abstract class NetworkService {

    private final Set<ServiceNode<?>> registeredNodes = new HashSet<>();

    public final void register(ServiceNode<?> node) {
        registeredNodes.add(node);
    }

    ...

}

基本的に、クラスからワイルドカード引数を削除しServiceNodeNetworkServiceクラスが拡張している型に置き換える方法はありますかNetworkService

4

1 に答える 1

16

次のように基本クラスをジェネリック化します。

public abstract class NetworkService<T extends NetworkService<T>> {

    private final Set<ServiceNode<T>> registeredNodes;

    ...
}

そして、それから次のように拡張します。

public class MyNetworkService extends NetworkService<MyNetworkService> {
    ...
}

不思議なことに繰り返される一般的なパターンのGoogle 。

于 2013-01-12T23:20:26.933 に答える