[英]Parameterizing superclass with static member class from subclass
有沒有辦法用子類的靜態成員類參數化超類?
ExampleSuperClass.java :
package foo;
public class ExampleSuperClass<T> {
protected T field;
public ExampleSuperClass(T field) {
this.field = field;
}
public T getField() {
return field;
}
}
ExampleSubClass.java :
package foo;
public class ExampleSubClass extends ExampleSuperClass<Member> {
static class Member {
}
public ExampleSubClass() {
super(new Member());
}
}
ExampleSubClass.java
上的編譯失敗,錯誤:
[javac] ExampleSubClass.java:3: error: cannot find symbol [javac] public class ExampleSubClass extends ExampleSuperClass<Member> { [javac] ^ [javac] symbol: class Member [javac] 1 error
或者在Eclipse中:
成員無法解析為某種類型
在Eclipse中, super
調用也有錯誤:
構造函數ExampleSuperClass(Member)引用缺少類型的Member
如果使用另一個受包受保護的頂級類參數化ExampleSubClass,它工作正常(也就是沒有錯誤)。
這背后的驅動力是我有一個通用的超類和許多不同的${SubClass-extends-GenericSuperClass}.java
和${ClassUsedBySubClass}.java
對。 但由於ClassUsedBySubClass
只是被SubClass
引用,所以它會很好:
ClassUsedBySubClass
成為靜態成員類來限制它 ClassUsedBySubClass
提供自己的文件來減少文件數量。 那么,有沒有辦法在參數化超類時使用子類的成員類?
如果沒有 - 是否有替代方法?
是的,你可以做到。 但是,由於Java使用聲明之外的作用域進行名稱解析,因此必須使用ExampleSubClass
的名稱限定Member
:
public class ExampleSubClass extends ExampleSuperClass<ExampleSubClass.Member> {
...
}
因為Member
是內部類,所以在將其用作泛型類型時需要指定。 我可以通過使用以下代碼來編譯它:
static class ExampleSubClass extends ExampleSuperClass<ExampleSubClass.Member> {
static class Member {
}
public ExampleSubClass() {
super(new Member());
}
}
Member
是一個靜態嵌套類。 使用封閉的類名訪問靜態嵌套類:
ExampleSubClass.Member
每次靜態嵌套類出現在其外部類的范圍之外時,都會執行此操作。
因此,以下是正確的:
public class ExampleSubClass extends ExampleSuperClass<ExampleSubClass.Member> {
^
enclosing class name
static class Member {
...
}
}
與要為靜態嵌套類創建對象時相同:
ExampleSubClass.Member member = new ExampleSubClass.Member();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.