2015-10-04 40 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