簡體   English   中英

使用子類中的靜態成員類參數化超類

[英]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引用,所以它會很好:

  1. 通過使ClassUsedBySubClass成為靜態成員類來限制它
  2. 通過不給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.

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