Java 使用泛型时编译失败?
我编写了下面的代码,它工作得非常好。问题是,当我将类从Java 使用泛型时编译失败?,java,generics,core,Java,Generics,Core,我编写了下面的代码,它工作得非常好。问题是,当我将类从A更改为泛型A时,它无法编译 public class A { class B { } static void m(B i) { } static class C extends B { C() { new A().super(); } } } 当我将A更改为A时,B上出现以下错误,编译失败 无法对非静态类型B进行静态引用 公共A类
A
更改为泛型A
时,它无法编译
public class A {
class B {
}
static void m(B i) {
}
static class C extends B {
C() {
new A().super();
}
}
}
当我将A
更改为A
时,B
上出现以下错误,编译失败
无法对非静态类型B进行静态引用
公共A类{
B类{
}
静态空隙m(B i){
}
静态类C扩展了B{
C(){
新的A().super();
}
}
}
有人能告诉我为什么它在第一种情况下运行良好,而在第二种情况下运行失败在一般情况下,当你提到
B
时,你实际上是指A.B
的一个实例
除非您有A
的封闭实例,否则您实际上是在试图封闭对A
的原始引用。这是不允许的,因为B
希望引用与其封闭实例关联的类型变量,该实例不存在
在非泛型的情况下,没有类型变量,因此B
没有试图引用不存在的东西
最简单的解决方案是显式地添加A
,例如:
static void m(A<?>.B obj)
静态空隙m(A.B obj)
或
静态空隙m(A.B obj)
及
静态类C扩展了A.B{
C(){
新的A().super();
}
}
因为在第二种情况下,您有一个内部类,它只属于特定类型的父类。但子类也只扩展到泛型内部类,如果您更仔细地观察编译错误,它会说一些不同的东西。@showstepper这与您上次所说的解释相同。没有,它也将在混凝土类中中断,这就是我粘贴屏幕截图的原因。。这一次:)@我复制并粘贴了我以前的答案。这应该是我的错误,对由此造成的不便表示歉意。
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();
}
}