[英]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{}
}
該代碼是非法的,因為M
在C
的主體外部,注釋和類型參數中使用。
在Java 5之前,沒有注釋/泛型,因此“ C的整個主體”涵蓋了“ M”的所有位置,因此可以明智地進行引用。 但是現在規則已經過時了,我們確實應該稍微擴展M
的范圍; 我認為這樣做沒有任何問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.