Java Generics mit innerer Klasse und innerer Schnittstelle

8

Unten habe ich eine generische OuterClass, eine InnerClass, die OuterClass Generics und verwendet nicht generisches InnerInterface.

%Vor%

In der folgenden Hauptmethode verwende ich zwei Instanzen von OuterClass, o1 parametrisiert mit und o2 mit. Meine anonyme innere Klasse myListener versucht den generischen Typ der äußeren Klasse (E) zu verwenden. Der folgende Code kompiliert nicht (Integer i = innerClass.someMethod () - Typenkonflikt: kann nicht von Object in Integer konvertiert werden).

%Vor%

Ich möchte ausdrücken, dass myListener für o1 ist, und sollte E = Integer verwenden, ohne es zu wiederholen (ohne zu wiederholen, ich sage es bereits, wenn ich o1 deklariere). Ist das möglich?

Vielen Dank! Faton.

    
Faton 23.03.2011, 09:04
quelle

2 Antworten

13

Eine innere Schnittstelle oder enum ist implizit statisch und statische Member sind nicht mit den Typparametern der äußeren Klasse parametrisiert. So sollte InnerInterface wie folgt aussehen:

%Vor%

Beachten Sie, dass der E -Parameter von InnerInterface nicht derselbe ist wie der E -Parameter von OuterClass .

    
Laurent Pireyn 23.03.2011 09:27
quelle
1

Wie immer helfen nicht verschachtelte Typen von private nicht dabei, die Dinge einfach zu halten. Schieben Sie das Boot hinaus und erstellen Sie neue Dateien, auch wenn Ihre IDe gegen Sie arbeitet.

Trotzdem teilen statische Member einer Klasse nicht die generischen Parameter der äußeren Klasse. Dies ist wichtig für das Verhalten von Feldern und ermöglicht mehr Flexibilität bei statischen geschachtelten Typen (z. B. InnerInterface ), auch wenn Sie dies nicht möchten. In Ihrem Fall müssen Sie also Ihrer (statischen) verschachtelten Schnittstelle einen generischen Parameter geben. Für $ Gottheit, verwenden Sie eine andere Kennung!

%Vor%

(Ich habe auch InnerClass wo nötig angepasst.)

Bearbeiten: Es ist wahrscheinlich wert, nur die ursprüngliche anonyme innere Klasse isoliert vom Rest der Nutzung zu betrachten:

%Vor%

Integer erscheint nur einmal an einer Stelle, an der eindeutig nicht festgestellt werden kann, dass sie korrekt ist.

    
Tom Hawtin - tackline 23.03.2011 09:50
quelle

Tags und Links