2015-10-04 73 views
1

我有一个类,如:的Java内部类的进口在声明类

package com.example; 

public abstract class AbstractClass<S> { 
     //stuffs 
} 

然后继承它的类,并定义泛型类型作为自己的内部类:

package com.example2; 

import com.example.AbstractClass; 
import com.example2.MyObject.MyObjectInnerClass; 

public class MyObject extends AbstractClass<MyObjectInnerClass> { 

    //other stuffs 

    public static class MyObjectInnerClass { 

    } 
} 

为什么需要导入com.example2.MyObject.MyObjectInnerClass如果它保持在同一个文件中?

回答

2
import com.example.AbstractClass; 
import com.example2.MyObject.MyObjectInnerClass; 

public class MyObject extends AbstractClass<MyObjectInnerClass> { 

这是需要,因为MyObjectInnerClass嵌套(未内)类只与{内部的unqualifed名称,附带的extends子句中使用它后存在。

写这将是一个更传统的方式:

import com.example.AbstractClass; 

public class MyObject extends AbstractClass<MyObject .MyObjectInnerClass> { 
+1

这应该是公认的答案,因为它实际上给出了原因。 – zubergu

2

我们首先说 - 它不是内部类,它是嵌套类(内部类是非静态嵌套类)。

这是需要两个重要的原因导入:

  1. 它需要知道哪一个类你的意思是 - 你也可以有MyObjectInnerClass在同一个包中的MyObject类。对这样的类的无引用引用将指向那一个。
  2. 这就是嵌套类的用途 - 将逻辑层次结构中的类分组。

请注意,习惯上,而不是导入,写MyObject.MyObjectInnerClass强调两者之间的关系。

+0

(1)是不正确的,在所有的:无论是否有任何歧义无论是进口或资格是必需的。 (2)不是需要进口的原因。 – EJP

+0

@EJP(1)是正确的 - 因为我们谈论的是语言规范,模糊性的可能性足以导致进口的严重性,这就是我写的。至于(2)...真 – Deltharis

+0

它*不*必须。你可以写FQN。那里没有歧义。 – EJP