我有一个奇怪的编译问题,它涉及将继承的静态内部类用作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 {
    }
}


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

07-24 14:29