有没有办法用子类的静态成员类来参数化超类?
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
的访问权限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
自己的文件来减少文件数。那么,有没有办法在参数化超类时使用子类的成员类?
如果没有 - 是否有替代方法?
答案 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();