[英]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.