2016-10-28 9 views
1

Ich habe Schnittstelle mit Generika:Vererben Generics-Schnittstelle in Java

public interface Cache<CachePrimaryKey extends Object, RowModel extends CacheRowModel> 

Ich brauche Kind-Schnittstelle zu schaffen, die Cache erweitert, sondern fügt neue Methoden während Generika zu halten. Was wäre die korrekte Syntax, um den Generikenteil beizubehalten?

Ich habe Implementierung wie.

public class InfoCache implements Cache<Long, DataRowModel> 

Ich versuchte

public interface EnrichedCache<CachePrimaryKey extends Object, 
     RowModel extends CacheRowModel> extends Cache 

aber wenn ich Schnittstelle für InfoCache-Klasse von Cache zu EnrichedCache ändern, ich bin „nicht zwingende Methoden von ihrer Oberklasse“ zu bekommen. Wenn ich "Methoden implementieren" in IntelliJ anstelle von Methoden für Long + DataRowModel verwenden, bietet es Methoden für Object und CacheRowModel (was ist nicht was ich will).

Was wäre der richtige Weg, um die Schnittstelle zu erben und alle Generika zu behalten?

+2

'öffentliche Schnittstelle EnrichedCache erweitert Cache '. –

+0

Beachten Sie, dass allgemein verwendete Stilrichtlinien erfordern, dass generische Namen ** einzelne Großbuchstaben ** oder möglicherweise mehrere Großbuchstaben ** sind. Ihre Namenskonventionen sind die gleichen wie für Klassen, was sehr verwirrend ist. Zum Beispiel, was 'öffentliche Schnittstelle Cache ' tun, denken Sie? –

+0

Außerdem 'Cache

Antwort

3

Das Wichtigste zuerst, verwenden wir Großbuchstaben Generika darstellen, ist dies die folgenden Unsinn zu vermeiden:

public interface Cache<String> { 
    String getKey(); 
} 

Was tun Sie Sache das obige interface tut?


Also, Umschreiben Ihre interface als:

public interface Cache<K, R extends CacheRowModel> 

zur Kenntnis, dass extends Object ein Unsinn ist, habe ich es

Dann wird eine generische interface dass extends Cache zu erstellen entfernt und hält die gleiche Generika, die wir tun würden:

public interface EnrichedCache<K, R extends CacheRowModel> extends Cache<K,R> 

das heißt wir haben eine generische interface die K Parameter hat (kann alles sein) und R dass extends Cache mit den gleichen Parametern (muss eine Unterklasse von CacheRowModel sein).


können Sie die Generika ziehen Sie auf zu übergeben:

public interface NumericCache<K extends Number, R extends CacheRowModel> extends Cache<K,R> 

Hier benötigen wir den Schlüssel für NumericCache-extends Number.

können Sie legen auch ein generischer Parameter auf einen konkreten Typ und passieren auf dem zweiten:

public interface StringCache<R extends CacheRowModel> extends Cache<String, R> 

hier explizit den Schlüssel des geerbten Cache String setzen wir aber ermöglichen es dem Benutzer CacheRowModel zu verwenden angeben.

0

Ihre zweite Schnittstelle erweitert den Raw Cache.

diesen Code Versuchen:
public interface EnrichedCache<CachePrimaryKey extends Object, RowModel extends CacheRowModel> extends Cache<CachePrimaryKey, RowModel>