具有内部类和内部接口的Java泛型

Fat*_*ton 9 java generics

下面我有一个通用的OuterClass,一个使用OuterClass泛型和非泛型InnerInterface的InnerClass.

public class OuterClass<E> {

    public class InnerClass  {

        public E someMethod() {
            return null;
        }
    }

    public interface InnerInterface{
        public void onEvent(OuterClass.InnerClass innerClass);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public class Test {
    public static void main(String[] args) {

        OuterClass<Integer> o1 = new OuterClass<Integer>();
        OuterClass<String> o2 = new OuterClass<String>();

        OuterClass.InnerInterface innerInterface = new OuterClass.InnerInterface() {
            @Override
            public void onEvent(InnerClass innerClass) {
                Integer i = innerClass.someMethod();
            }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

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

非常感谢!Faton.

Lau*_*eyn 15

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

public interface InnerInterface<E> {
    void onEvent(OuterClass<E>.InnerClass innerClass);
}
Run Code Online (Sandbox Code Playgroud)

注意E的参数InnerInterface一样E的参数OuterClass.

  • 或许那么,最好不要称之为E? (8认同)
  • 谢谢Laurent.它会工作,但我要重复<Integer>,因为它是一个不同的E.我的问题是"是否可以重用第一个E = <Integer>",并阻止重新声明接口的<Integer>? (2认同)