Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用泛型时编译失败?_Java_Generics_Core - Fatal编程技术网

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();
    }
}