2013-01-12 18 views
5

Gibt es eine Möglichkeit, einen Typ der Klasse für ein generisches Argument zu verwenden? Zum Beispiel habe ich diese Klasse ServiceNodeJava Generics <this??>

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; 
    } 

.... 

} 

, die ein Teil der abstrakten Klasse von ServiceNode in der NetworkService Klasse NetworkService

public abstract class NetworkService { 

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

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

    ... 

} 

Also im Grunde ist es das Wildcard-Argument ohnehin zu entfernen und ersetzen Sie es mit welcher Typ auch immer die Klasse ist NetworkService

+4

Nein, gibt es nicht. –

+0

Wenn ich fragen darf - warum machen eine konkrete Klasse "weise" von ihrer äußeren Klasse abhängig? – fge

Antwort

16

Genericise Ihre Basisklasse so:

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

    private final Set<ServiceNode<T>> registeredNodes; 

    ... 
} 

und dann von ihm verlängern somit:

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

Google für neugierig wiederkehrende generische Muster.