内部类/接口中定义的泛型类型是否绑定到外部类泛型类型定义?

时间:2014-08-13 10:14:49

标签: java generics

在此代码中:

public class MyClass<T extends Enum<T>> {

    public static interface MyInt<T> {

    }

    // ...

}

T中的MyInt<T>类型与T中的MyClass<T extends Enum<T>>相同吗?或者它是否定义了一个新的泛型类型,以便将该接口移动到一个单独的文件不会改变任何东西?

在考虑了一下之后,我猜这两种类型是独立的,因为我总是能够基于接口(使用 new MyInt<Integer>() { ... } )实例化一个对象,而不需要任何引用外类;但我还是要求它收集评论和想法。

2 个答案:

答案 0 :(得分:3)

我必须在JLS中查找它,但我记得内部接口始终是静态的,即不需要static关键字。因此MyInt完全独立于MyClass,但MyClass充当MyInt的命名空间。

如果MyInt是非静态内部类,MyInt的类型参数将隐藏/重新定义MyClass的类型参数,因为MyInt将不是独立的来自MyClass

来自JLS §8.5.1

  

成员接口是隐式静态

答案 1 :(得分:2)

是的,T's都是相互独立的。为什么?。好吧,因为泛型是在类级别定义的。静态内部类/接口不能访问由其封闭类定义的类型,而内部类(非静态类)可以。

示例:

public class Test<T> {
public void printMe(T t) {
    System.out.println("Test");
}

public static void main(String[] args) {

}

public static interface MyInt<E> {
    public void someMethod(T t);

    // compilation error - What is 'T'? .
    public void someOtherMethod(S s);

    // compilation error - What is 'S'? .
    public void methodDoesntCompile(E e);

}

class AnotherTest<S> {
    public void someMethod(T t) {
        // T is valid. Referred from parent class
        System.out.println("someMethod");
    }

    public void someOtherMethod(S s) {
        System.out.println("someMethod");
    }

    public void methodDoesntCompile(E e) {
        // compilation error - What is 'E'? .
        System.out.println("someMethod");
    }

}

static class StaticAnotherTest<Q> {
    public void someMethod(T t) {
        // compilation error - What is 'T'? .
        System.out.println("someMethod");
    }

    public void someOtherMethod(Q q) {

        System.out.println("someMethod");
    }

}

}