通过子类包限定符导入父类的内部接口

时间:2019-08-05 03:46:16

标签: java inheritance import inner-classes

我有2个这样的课程:

父类A:

public class A {   
  public interface A2 {
  }
}

B级儿童:

public class B extends A {
}

当我使用A的内部接口时:

import com.company.A.A2;         //statement 1
import com.company.B.A2;         //statement 2 -> error here!

//...
com.company.A.A2 a21;            //statement 3
com.company.B.A2 a22;            //statement 4

除我标记的语句(语句2 )外,所有语句均有效。我想知道:

  • 为什么我可以使用完全限定词“ com.company.B.A2 ”声明为“ 声明4 ”,但不能使用“ 声明2”导入该声明

PS: 我知道com.company.A.A2和com.company.A.A2是1类的2个别名。

  • 如果Java允许语句4,则应该允许语句2
  • 如果Java不允许语句4,则不应允许语句4, 也是
  • 我认为Java是否允许语句4有效确实是模棱两可的。

1 个答案:

答案 0 :(得分:1)

JLS 6.7, Fully Qualified Names and Canonical Names(已抓取)

  

每个成员类,成员接口和数组类型可能具有完全限定的名称:

     
      
  • 当且仅当C具有完全限定名称时,另一个类或接口C的成员类或成员接口M才具有完全限定名称。

         

    在这种情况下,M的完全限定名称由C的完全限定名称组成,后跟“。”,然后是M的简单名称。

  •   
  

每个成员类,成员接口和数组类型都可以具有规范名称:

     
      
  • 在另一个类或接口C中声明的成员类或成员接口M仅当C具有规范名称时才具有规范名称。

         

    在这种情况下,M的规范名称由C的规范名称组成,后跟“。”,然后是M的简单名称。

  •   

示例6.7-2特别注意您的示例中的*.A.A2*.B.A2都是该接口的FQN,但是只有*.A.A2规范的名称因为那是A2声明的地方。

JLS 7.5, Import Declarations

  
      
  • 单一类型导入声明(第7.5.1节)通过提及其规范名称(第6.7节)来导入单个命名类型。
  •