使用子类中的静态成员类参数化超类

时间:2018-05-18 19:54:05

标签: java generics

有没有办法用子类的静态成员类来参数化超类?

Contrived Example

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作为静态成员类来限制ClassUsedBySubClass的访问权限
  2. 通过不给Private Sub RawMaterial_AfterUpdate() sSQL = "UPDATE tmp_Formula INNER JOIN tbl_RawMaterial ON tmp_Formula.RawMaterial = tbl_RawMaterial.RawMaterial " _ & "SET tmp_Formula.MiscInfo = [tbl_RawMaterial].[MiscInfo], tmp_Formula.Potency = [tbl_RawMaterial].[Potency], " _ & "tmp_Formula.PUoM = [tbl_RawMaterial].[PUoM], tmp_Formula.CUoM = [tbl_RawMaterial].[ClaimUoM], " _ & "tmp_Formula.Cost = [tbl_RawMaterial].[Cost], tmp_Formula.CostUoM = [Tbl_RawMaterial].[CostUoM];" CurrentDb.Execute sSQL, dbFailOnError CurrentDb.TableDefs.Refresh Me.Refresh End Sub 自己的文件来减少文件数。
  3. 那么,有没有办法在参数化超类时使用子类的成员类?

    如果没有 - 是否有替代方法?

3 个答案:

答案 0 :(得分:14)

是的,你可以做到。但是,由于Java使用范围 outside 声明进行名称解析,因此您必须使用Member的名称限定ExampleSubClass

public class ExampleSubClass extends ExampleSuperClass<ExampleSubClass.Member> {
    ...
}

答案 1 :(得分:8)

因为Member是内部类,所以在将其用作泛型类型时需要指定。我可以使用以下代码来编译它:

static class ExampleSubClass extends  ExampleSuperClass<ExampleSubClass.Member> {
    static class Member {

    }

    public ExampleSubClass() {
        super(new Member());
    }
}

答案 2 :(得分:3)

Member是一个静态嵌套类。使用封闭的类名访问静态nested类:

ExampleSubClass.Member

每次静态嵌套类出现在其外部类的范围之外时,都会这样做。

因此,以下是正确的:

public class ExampleSubClass extends ExampleSuperClass<ExampleSubClass.Member> {
                                                              ^
                                                     enclosing class name
    static class Member {
        ...
    }
}

与想要为静态嵌套类创建对象时相同:

ExampleSubClass.Member member = new ExampleSubClass.Member();