作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了以下代码,它运行得非常好。问题是当我从 A
更改类(class)时到泛型 A<T>
然后编译失败。
public class A {
class B {
}
static void m(B i) {
}
static class C extends B {
C() {
new A().super();
}
}
}
当我改变A
至A<T>
编译失败,并在 B
上出现以下错误.
Cannot make a static reference to the non-static type B
public class A<T> {
class B {
}
static void m(B i) {
}
static class C extends B {
C() {
new A().super();
}
}
}
有人可以告诉我为什么它在第一种情况下工作正常而在第二种情况下失败
最佳答案
在一般情况下,当您引用B
时,您实际上指的是 A<T>.B
的实例.
除非您有 A<T>
的封闭实例,您实际上是在尝试包含对 A
的原始引用。这是不允许的,因为 B
想要引用与其封闭实例关联的类型变量,但该实例不存在。
在非泛型情况下,没有类型变量,因此B
并不是试图引用不存在的东西。
最简单的解决方案是添加 A<T>
明确地,例如
static void m(A<?>.B obj)
或
static <T> void m(A<T>.B obj)
和
static class C<T> extends A<T>.B {
C() {
new A<T>().super();
}
}
关于java - 使用泛型编译失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43677752/
我是一名优秀的程序员,十分优秀!