如果类型参数是Java中子类的内部类,则找不到该类型参数
为什么以下代码有编译错误: Foo.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
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-这并不是解释为什么需要限定类型。您的更新只说明静态嵌套类的行为类似于顶级类。