Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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 - Fatal编程技术网

如果类型参数是Java中子类的内部类,则找不到该类型参数

如果类型参数是Java中子类的内部类,则找不到该类型参数,java,Java,为什么以下代码有编译错误: Foo.java: public abstract class Foo<T> { public abstract T getInner(); } 公共抽象类Foo{ 公共摘要T getInner(); } MyFoo.java: public class MyFoo extends Foo<MyFooInner> { public static class MyFooInner { } public MyFo

为什么以下代码有编译错误:

Foo.java:

public abstract class Foo<T> {
    public abstract T getInner();
}
公共抽象类Foo{
公共摘要T getInner();
}
MyFoo.java:

public class MyFoo extends Foo<MyFooInner> {
    public static class MyFooInner {
    }
    public MyFooInner getInner() {
        return new MyFooInner();
    }
}
公共类MyFoo扩展了Foo{
公共静态类MyFooInner{
}
公共MyFooInner getInner(){
返回新的MyFooInner();
}
}
汇编第二节课的结果如下:

MyFoo.java:1: cannot find symbol
symbol: class MyFooInner
public class MyFoo extends Foo<MyFooInner> {
                               ^
1 error
MyFoo.java:1:找不到符号
符号:类MyFooInner
公共类MyFoo扩展了Foo{
^
1错误

除了将内部类放在自己的文件中之外,还有什么方法可以解决这个问题吗?

使用以下符号:

public class MyFoo extends Foo<MyFoo.MyFooInner> {...
公共类MyFoo扩展了Foo{。。。 更新:静态嵌套类实际上是指定的顶级类:

静态嵌套类与其外部对象的实例成员交互 类(和其他类)就像其他顶级类一样 实际上,静态嵌套类在行为上是 已嵌套在另一个顶级类中,以方便打包

因此,引用静态嵌套类的唯一方法是在某个地方引用其父类,否则就是引用导入的类或同一包中的类

更新:为了进一步解释,引用类的另一种方法是如下导入它:

import my.package.MyFoo.MyFooinner;

public class MyFoo extends Foo<MyFooInner> {...
导入my.package.MyFoo.MyFooinner;
公共类MyFoo扩展了Foo{。。。
要在其上构建,原因是类声明中标识的类型必须对该类之外的成员有意义。这与我 在另一个类文件中写入以下内容:

MyFooInner mfi = new MyFooInner()
这不会编译,因为该类不知道
MyFooInner
是什么-我要么需要通过编写
MyFoo.MyFooInner
来限定它,要么使用
import MyPackage.MyFoo.MyFooInner;
。同样的逻辑适用于类声明


出于同样的原因,声明为
private
的嵌套类根本不能在父类的声明中使用。

这是一个有趣的问题……我不确定语言是否允许这样做,因为Java泛型是通过类型擦除实现的。我希望您必须使MyFooInner成为顶级类。您还可以解释一下是吗?还是这只是一个侥幸的猜测?这是您引用静态嵌套类的通常方式:@AndreyAdamovich-这没有什么帮助。@忽必烈汗,您到底需要什么?@AndreyAdamovich-这并不是解释为什么需要限定类型。您的更新只说明静态嵌套类的行为类似于顶级类。