gpt4 book ai didi

java - 为什么 "cannot select from a type variable"

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:20:14 25 4
gpt4 key购买 nike

我有以下类(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 上收到“无法从类型变量中选择”错误?

不应应用类型删除。 TA1A2 但这在编译时是已知的。

那我应该如何返回子类构建器呢?我的主要目标是能够在 setter 混合子类和父类(super class)之后执行 setter。

最佳答案

这不可能工作:

T.Builder

由于 T 是一个类型变量,因此不绑定(bind)到任何特定类型,您不能指望编译器解析未知类型的嵌套类型。

T is either A1 or A2 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com