我有一个奇怪的编译问题,它涉及将继承的静态内部类用作Generic类型。
以防万一:每个单独的代码段都是同一包中的单独类。
ParentOuter和ParentInner:
public class ParentOuter <T extends ParentOuter.ParentInner> {
T field;
public static class ParentInner {
}
}
ChildOuter&ChildInner:
import com.company.ChildOuter.ChildInner;
//import com.company.ParentOuter.ParentInner;
public class ChildOuter extends ParentOuter <ChildInner> {
public static class ChildInner extends ParentInner {
}
}
TopLevelChild:
public class TopLevelChild extends ParentOuter.ParentInner {
}
以下是编译结果:
$ javac *.java
ChildOuter.java:8: error: cannot find symbol
public static class ChildInner extends ParentInner {
^
symbol: class ParentInner
location: class ChildOuter
ChildOuter.java:6: error: type argument ChildInner is not within bounds of type-variable T
public class ChildOuter extends ParentOuter <ChildInner> {
^
where T is a type-variable:
T extends ParentInner declared in class ParentOuter
2 errors
笔记:
当我取消注释
import com.company.ParentOuter.ParentInner;
时编译成功。
当我在
<TopLevelChild>
中使用<ChildInner>
而不是ChildOuter
时,编译成功问题:
因此,从我看来,
javac
无法确定,当
ChildInner
用作ParentInner
的子类时,通用类型。
真的是这样吗如果是这样,那为什么呢?是预期行为还是
javac
中的问题?Android Studio还将
ParentInner
的导入突出显示为“未使用的导入”,并在运行“优化导入”时将其删除,这使代码不可编译。所以,再次-是
Android Studio
还是javac
的问题?附言我长期面临着类似的问题,但最终决定发布此问题。
希望这不是第一次,因为我既无法在单一来源中也无法通过分析答案/文章的组合来找到答案。
最佳答案
是的,我们可以解决此问题而无需导入“ ParentInner”。
根本原因是,编译器无法解析“ ParentInner”。由于“ ParentInner”是“ ParentOuter”的静态成员。
因此,除了导入“ ParentInner”外,我们只需提及“ ParentOuter.ParentInner”
请找到经过调整的ChildOuter.java,
package com.company;
import com.company.ChildOuter.ChildInner;
//import com.company.ParentOuter.ParentInner;
public class ChildOuter extends ParentOuter <ChildInner> {
public static class ChildInner extends ParentOuter.ParentInner {
}
}
让我知道是否有帮助。谢谢