Java 的泛型、继承和内部静态类编译问题



我有一个奇怪的编译问题,与使用继承的静态内部类作为泛型类型有关。

以防万一:每个单独的代码片段都是同一包中的一个单独的类。

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

笔记:

  1. 当我取消评论时import com.company.ParentOuter.ParentInner;然后 编译成功。
  2. 当我在ChildOuter中使用<TopLevelChild>而不是<ChildInner>时,编译成功

问题:

  1. 所以,从我所看到的,看起来,javac无法确定, 该ChildInnerParentInner的子类,当它用作 泛型类型。

    真的是这样吗?如果是这样 - 那为什么?预期行为或问题是否javac

  2. 此外,Android StudioParentInner的导入突出显示为"未使用的导入",并在运行"优化导入"时将其删除,这使得代码不可编译。

    那么,再说一遍 - 这是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 {
}
}

让我知道这是否有帮助。谢谢

最新更新