在此代码中:
public class MyClass<T extends Enum<T>> {
public static interface MyInt<T> {
}
// ...
}
T
中的MyInt<T>
类型与T
中的MyClass<T extends Enum<T>>
相同吗?或者它是否定义了一个新的泛型类型,以便将该接口移动到一个单独的文件不会改变任何东西?
在考虑了一下之后,我猜这两种类型是独立的,因为我总是能够基于接口(使用 new MyInt<Integer>() { ... }
)实例化一个对象,而不需要任何引用外类;但我还是要求它收集评论和想法。
答案 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");
}
}
}