Jok*_*ker 2 java generics core
我写了以下代码,它的工作原理非常好.问题是当我将类更改A为Generics时,A<T>它无法编译.
public class A {
class B {
}
static void m(B i) {
}
static class C extends B {
C() {
new A().super();
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我更改A为A<T>编译失败并出现以下错误B.
无法对非静态类型B进行静态引用
public class A<T> {
class B {
}
static void m(B i) {
}
static class C extends B {
C() {
new A().super();
}
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我为什么它在第一种情况下工作正常并且第二次失败
在一般情况下,当你提到时B,你实际上指的是一个实例A<T>.B.
除非你有一个封闭的实例,否则你A<T>实际上是在尝试将原始引用括起来A.这是不允许的,因为B想要引用与其封闭实例关联的类型变量,该变量不存在.
在非通用情况下,没有类型变量,因此B不会尝试引用不存在的东西.
最简单的解决方案是A<T>明确添加,例如
static void m(A<?>.B obj)
Run Code Online (Sandbox Code Playgroud)
要么
static <T> void m(A<T>.B obj)
Run Code Online (Sandbox Code Playgroud)
和
static class C<T> extends A<T>.B {
C() {
new A<T>().super();
}
}
Run Code Online (Sandbox Code Playgroud)