我有一个奇怪的编译问题,与使用继承的静态内部类作为泛型类型有关。
以防万一:每个单独的代码片段都是同一包中的一个单独的类。
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 {
}
}
顶级儿童:
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;
然后 编译成功。 - 当我在
ChildOuter
中使用<TopLevelChild>
而不是<ChildInner>
时,编译成功
问题:
所以,从我所看到的,看起来,
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 {
}
}
让我知道这是否有帮助。谢谢