Génériques Java avec classe interne et interface interne

Ci-dessous, j’ai un OuterClass générique, un InnerClass qui utilise les génériques OuterClass et InnerInterface non générique.

public class OuterClass { public class InnerClass { public E someMethod() { return null; } } public interface InnerInterface{ public void onEvent(OuterClass.InnerClass innerClass); } } 

Dans la méthode principale ci-dessous, j’utilise deux instances de OuterClass, o1 paramétrée avec et o2 avec. Ma classe interne annonymous myListener essaie d’utiliser le type générique de la classe externe (E). Le code tel qu’il est ci-dessous ne comstack pas (Integer i = innerClass.someMethod () – Incompatibilité de type: impossible de convertir d’object en Integer).

 public class Test { public static void main(Ssortingng[] args) { OuterClass o1 = new OuterClass(); OuterClass o2 = new OuterClass(); OuterClass.InnerInterface innerInterface = new OuterClass.InnerInterface() { @Override public void onEvent(InnerClass innerClass) { Integer i = innerClass.someMethod(); } }; } } 

Je voudrais exprimer que myListener est pour o1 et doit utiliser E = Integer, sans le répéter (sans le répéter, je le dis déjà lorsque je déclare o1). Est-ce possible?

Merci beaucoup! Faton.

Une interface interne ou une énumération est implicitement statique et les membres statiques ne sont pas paramétrés avec les parameters de type de la classe externe. Donc, InnerInterface devrait ressembler à ceci:

 public interface InnerInterface { void onEvent(OuterClass.InnerClass innerClass); } 

Notez que le paramètre E de InnerInterface n’est pas identique au paramètre E de OuterClass .

Comme toujours, les types nesteds non private ne permettent pas de garder les choses simples. Poussez le bateau et créez de nouveaux fichiers, même si votre IDe fonctionne contre vous.

Quoi qu’il en soit, les membres statiques d’une classe ne partagent pas les parameters génériques de la classe externe. Ceci est important pour le comportement des champs et permet plus de flexibilité sur les types nesteds statiques (tels que InnerInterface ) même si vous ne le souhaitez pas. Ainsi, dans votre cas, vous devez atsortingbuer à votre interface nestede (statique) un paramètre générique. Pour l’amour de $ divinité, utilisez un identifiant différent!

 public class OuterClass { public class InnerClass { public E someMethod() { return null; } } public interface InnerInterface { void onEvent(OuterClass.InnerClass innerClass); } } public class Test { public static void main(Ssortingng[] args) { OuterClass o1 = new OuterClass(); OuterClass o2 = new OuterClass(); OuterClass.InnerInterface innerInterface = new OuterClass.InnerInterface() { @Override public void onEvent(OuterClass.InnerClass innerClass) { Integer i = innerClass.someMethod(); } }; } } 

(J’ai également qualifié InnerClass si nécessaire.)

Edit: Cela vaut probablement la peine de simplement regarder la classe interne d’origine anonyme, isolée du rest de l’utilisation:

 public interface InnerInterface{ public void onEvent(OuterClass.InnerClass innerClass); } OuterClass.InnerInterface innerInterface = new OuterClass.InnerInterface() { @Override public void onEvent(InnerClass innerClass) { Integer i = innerClass.someMethod(); } }; 

Integer n’apparaît qu’une seule fois, dans un endroit où il est clairement impossible d’en déduire qu’il est correct.