2013-07-05 88 views
4

文件AbstractContainer.javaStatic Nested Class和作爲約束泛型類型不起作用

package container; 

import static container.AbstractContainer.*; 

public abstract class AbstractContainer<ElementType extends AbstractElement> { 
    public static abstract class AbstractElement { 
    } 
} 

文件ConcreteElement.java

package container; 

import static container.ConcreteContainer.*; 
import static container.AbstractContainer.*; 

public class ConcreteContainer extends AbstractContainer<ConcreteElement> { 
    public static class ConcreteElement extends AbstractElement { 
    } 
} 

此代碼給了我一個編譯錯誤:

java: type argument container.ConcreteContainer.ConcreteElement is not within bounds of type-variable ElementType 

但是IDE沒有看到任何問題(IDEA 12)。

第一:這是怎麼回事?

第二個問題,AbstractContainer.java爲什麼我要靜態導入嵌套類,這顯然是在範圍,使用它在通用類型(extends AbstractElement代替extends AbstractContainer.AbstractElement)?

回答

1

首先,您不必靜態導入類。只是限定引用您的內部類:

public abstract class AbstractContainer<ElementType extends 
    AbstractContainer.AbstractElement> { 

public class ConcreteContainer extends 
    AbstractContainer<ConcreteContainer.ConcreteElement> 

當與Java 1.6編譯,我沒有看到你的編譯器錯誤。但是在編譯1.7時我確實看到它。

碰巧,完全合格的AbstractElement聲明ConcreteElement時似乎滿足compiiler:

public class ConcreteContainer extends 
    AbstractContainer<ConcreteContainer.ConcreteElement> { 
              // fully qualify here 
    public static class ConcreteElement extends AbstractContainer.AbstractElement { 
    } 
} 
+0

關於第一:但爲什麼我必須導入靜態到**不**完全限定名稱?在課堂內我不需要那樣做。關於第二部分:完全限定名稱改變了什麼?我有一個靜態導入! – Kiel

+0

您所寫的所有內容都可以正常工作,但它爲什麼會起作用? – Kiel

1

第一個問題 - 可能是一個編譯器錯誤。

第二個問題 - 可能是由於技術性:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.3

The scope of a declaration of a member m declared in or inherited by a class type C (§8.1.6) is the entire body of C

例如

@SomeAnnotation(M.class) 
class C 
<T extends M> 
{ 
    static class M{} 
} 

的代碼是非法的,因爲M使用的C體外,在註釋,並在類型參數。

在Java 5之前,沒有註釋/泛型,因此「C的整個主體」涵蓋了所有地方,「M」可以被明智地引用。但是現在這個規則已經過時了,我們應該真的擴大M的範圍;我看不出有任何問題。

+0

*我們應該真的擴展M *的範圍 - 我們*您是指Java社區/語言設計團隊?感謝你的回答 – Kiel