gpt4 book ai didi

java - 为什么从 Java 中的自绑定(bind)泛型返回 this 时需要强制转换

转载 作者:行者123 更新时间:2023-11-30 02:23:11 25 4
gpt4 key购买 nike

在这种情况下,我的 IDE 在 return 语句中显示编译错误。

public class Base<T extends Base>{
public T get(){
return this;
}
}

当我按照下面的代码添加类型转换时,一切正常,但我不明白为什么需要类型转换。

public class Base<T extends Base>{
public T get(){
return (T) this;
}
}

Java 不会用有界类型替换所有有界泛型吗?有人可以解释一下幕后发生了什么以及为什么需要类型转换吗?

编辑 1。

感谢 Lothars 和 algrid 的回答,现在很清楚这个独立案例可能会导致 ClassCastException。这是不安全的,因此 Base 可能应该是抽象的。

这样做的目的是为 Builder 类创建一个基类,以便扩展方法将返回扩展类的类型。这是方法链所需要的。在下面的示例中,child.setParamOne(1) 的返回类型将为 Child,尽管它是在上面的继承层次结构中定义的。

这段代码安全吗?您对解决这个问题有什么建议或替代方案吗?

public abstract class Base<T extends Base>{
int paramOne;

public T setParamOne(int param){
this.paramOne = param;
return (T) this;
}
}

public final class Child extends Base<Child> {
int paramTwo;

public Child setParamTwo(int param){
this.paramTwo = param;
return this;
}
}

public static void main(String[] args) {
Child c = new Child()
.setParamOne(1)
.setParamTwo(1);
}

最佳答案

为什么你认为你的this类型为T ?它的类型为 Base<T> .

尝试运行以下代码,您将得到 ClassCastException :

public class Main {

public static void main(String[] args) {
Base<Child> b = new Base<>();
// b.get() returns an instance of Base, not Child (however it's mistakenly cast to Child)
Child1 c = b.get();
}

public static class Base<T extends Base>{
public T get(){
return (T) this;
}
}

public static class Child extends Base {
}
}

关于java - 为什么从 Java 中的自绑定(bind)泛型返回 this 时需要强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46288025/

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