2017-12-09 3 views
3

Ich möchte wissen, ob es möglich ist, den Typ eines Parameters zu setzen, der der Typ der Klasse ist, die eine bestimmte Schnittstelle implementiert. Sehen Sie einige Code wird sich die Frage deutlicher:Wie setzt man den Typparameter der implementierenden Klasse der Schnittstelle?

interface A { 
A sum (???? another); 
} 

class AClass implements A { 
    private int internalStuff; 

    A public sum (???? another) { 
     // I want to access another.internalStuff in a type safe fashion 
    } 
} 

ich natürlich ersetzen kann ???? mit A-Typ und innerhalb AClass.sum, werfen Sie es auf AClass, aber das ist hässlich. Kann "????" ersetzt werden mit einer aussagekräftigen Typdeklaration?

Antwort

3

Es gibt keinen Selbst-Typ in Java, Sie müssen also einen kleinen Trick machen, um dies zu erreichen.

Sie können einen Typparameter mit einem rekursiven Typ hinzufügen, der an die Schnittstelle gebunden ist. Die implementierende Klasse setzt diesen Parameter auf einen eigenen Typ. Wie folgt aus: obwohl

interface A<T extends A<T>> { 
    A sum (T another); 
} 

class AClass implements A<AClass> { 
    private int internalStuff; 

    public A sum(AClass another) { 
     // .... 
    } 
} 

Es gibt nichts AClass zu tun implements A<SomeOtherAClass> zu stoppen. Sie müssen der implementierenden Klasse vertrauen, um den korrekten Typparameter anzugeben.

+0

Seltsame Syntax, aber semantisch macht Sinn. Danke –

+0

Sie könnten auch abstrakte Klasse mit geschützten Variablen verwenden – Gaskoin

Verwandte Themen