簡體   English   中英

靜態嵌套類作為泛型類型綁定不起作用

[英]Static nested class as generic type bound doesn't work

文件AbstractContainer.java

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 )?

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

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

public class ConcreteContainer extends 
    AbstractContainer<ConcreteContainer.ConcreteElement>

使用Java 1.6進行編譯時,看不到您的編譯器錯誤。 但是我在用1.7編譯時確實看到了它。

碰巧的是,在聲明ConcreteElement時完全合格的AbstractElement似乎滿足了編譯器的要求:

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

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

第二個問題-可能由於技術原因:

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

在類C中聲明或繼承的成員m聲明范圍(第8.1.6節)是C的整個主體

例如

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

該代碼是非法的,因為MC的主體外部,注釋和類型參數中使用。

在Java 5之前,沒有注釋/泛型,因此“ C的整個主體”涵蓋了“ M”的所有位置,因此可以明智地進行引用。 但是現在規則已經過時了,我們確實應該稍微擴展M的范圍; 我認為這樣做沒有任何問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM