gpt4 book ai didi

java - 在子类对象上链接方法,从两个类返回 this 的方法

转载 作者:搜寻专家 更新时间:2023-11-01 02:25:23 25 4
gpt4 key购买 nike

我有 2 个类:

public class A {
private final List<String> list;

public A() {
list = new ArrayList<String>();
}

public A first(String s) {
list.add(s);
return this;
}

public A second() {
System.out.println(list);
return this;
}
}

public class B extends A {
public B bfisrt() {
System.out.println("asd");
return this;
}
}

还有一个带main的类,下面是main work中的代码

B b = new B();

b.first("unu")
.second();

b.bfirst();

但我想将来自两个类的方法链接到同一个对象上。那可能吗?喜欢

B b = new B();

b.first("unu")
.second()
.bfisrt();

最佳答案

让我们分解一下。

public A first(String s){       
list.add(s);
return this;
}

方法的返回类型是A , 所以调用 new B().first("hi")返回 A 类型的对象.所以当我尝试编译时,我预计会收到一条错误消息 incompatible types .

您可以像 markspace answers 一样覆盖该方法并执行相同操作但返回 B :

public B first(String s){  
super.first( s );
return this;
}

甚至

public B first(String s) {  
return (B)super.first(s);
}

当返回类型为A 时,Kesheva 的方法要求您手动进行转换, 但你知道它是 B .

B b = new B();
((B)b.first("unu").second()).bfisrt();

但是,尤其是对于需要多次转换的较长链,这会造成代码困惑。

这是另一个可能满足您需求的解决方案。

public abstract class A {
public <Unknown extends A> Unknown first(String s) {
System.out.println("in here");
return (Unknown)this;
}
}

public class B extends A { }

public static void main(String[] args) {
//compiles without overriding the method or manually casting.
B b = new B().first("hi").first("hello");
}

关于 this StackOverflow thread您可以阅读为什么这行得通。

编辑:正如 newacct 指出的那样,它可能有点安全,但如果您不使用构建器模式如果你不看你分配给什么。考虑以下两段代码:

B b = new B().first("hi").first("hello"); 
// above compiles and works. You assign 'B b' to a `new B()`

class C extends A { }
C c = new B().first("hi");
// ClassCastException, but you can see that instantly. 'C c' gets assigned to 'new B()'

关于java - 在子类对象上链接方法,从两个类返回 this 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24951237/

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