具有内部类和内部接口的Javagenerics

下面我有一个通用的OuterClass,一个使用OuterClassgenerics和非genericsInnerInterface的InnerClass。

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

在下面的主要方法中,我使用OuterClass的两个实例,o1参数化,和o2。 我的匿名内部类myListener尝试使用外部类(E)的generics类型。 下面的代码不能编译(Integer i = innerClass.someMethod() – 类型不匹配:无法从Object转换为Integer)。

 public class Test { public static void main(String[] 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(); } }; } } 

我想表达myListener是为o1,并且应该使用E = Integer,而不重复它(不重复,我在声明o1时已经说过)。 那可能吗?

非常感谢! Faton。

内部接口或枚举是隐含的静态,静态成员不使用外部类的类型参数进行参数化。 所以InnerInterface看起来应该是这样的:

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

请注意, InnerInterfaceE参数与InnerInterfaceE参数不同。

与往常一样,非private嵌套类型无助于保持简单。 即使您的IDe对您不利,也要将船推出并创建一些新文件。

无论如何,类的静态成员不共享外部类的generics参数。 这对于字段的行为很重要,并且即使您不需要它,也可以在静态嵌套类型(例如InnerInterface )上提供更大的灵活性。 因此,在您的情况下,您需要为(静态)嵌套接口提供通用参数。 为了$ deity,使用不同的标识符!

 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(String[] 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(); } }; } } 

(我还在必要时对InnerClass进行了限定。)

编辑:与其他用法分开看,原始的匿名内部类可能是值得的:

 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只出现一次,在一个显然无法推断为正确的地方。