作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有以下类(class):
public abstract class A {
public String att;
public static abstract class Builder<T extends A> {
public T a;
public abstract T build();
public T.Builder setAtt(String a) {
this.a.att = a;
return this;
}
}
}
public class A1 extends A {
public static class Builder extends A.Builder<A1> {
public Builder() {
this.a = new A1();
}
public A1 build() {
return this.a;
}
}
}
public class A2 extends A {
public String subAtt;
public static class Builder extends A.Builder<A2> {
public Builder() {
this.a = new A2();
}
public A2 build() {
return this.a;
}
public Builder setSubAtt(String subAtt) {
a.subAtt = subAtt;
return this;
}
}
}
为什么我在 A.setAtt
上收到“无法从类型变量中选择”错误?
不应应用类型删除。 T
是 A1
或 A2
但这在编译时是已知的。
那我应该如何返回子类构建器呢?我的主要目标是能够在 setter 混合子类和父类(super class)之后执行 setter。
最佳答案
这不可能工作:
T.Builder
由于 T
是一个类型变量,因此不绑定(bind)到任何特定类型,您不能指望编译器解析未知类型的嵌套类型。
T
is eitherA1
orA2
but this is known at compile-time.
这个假设是错误的:假设您将代码作为 JAR 提供,而另一个开发人员使用它,引入他自己的 A
子类。如果 Java 代码是在封闭世界的假设下编译的,Maven 将是最无用的服务。
这个假设也是无关紧要的:你需要一个相当复杂的类型系统来确定 T.Builder
符合什么通用类型。
关于java - 为什么 "cannot select from a type variable",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28434004/
我是一名优秀的程序员,十分优秀!