让我们将这段代码视为我们的例子:
import java.awt.*;
class Maze extends Panel{
String name;
public static void main(String[] args){
Maze m = new Maze();
System.out.println(m.setName("Hello World").getName());
}
public Maze setName(String name){
this.name = name;
return this;
}
public String getName(){
return name;
}
public void paint(){
}
}
我正在尝试理解方法链,并且正如其他问题的答案所说,请使用return this
。我尝试了它,是的它可行,但不是像上面的方法setName()
那样的mutator方法。为什么编译器输出:
The return type is incompatible with Component.setName(String)
答案 0 :(得分:8)
你提供的代码应该没问题。
但是,我怀疑问题是您的真实代码是一个扩展Component
的类,而您正试图覆盖 setName
也许相反,您可以编写withName
方法,如下所示:
public Maze withName(String name) {
setName(name); // Inherited method
return this;
}
...虽然您应该知道{} {}}经常在API中用于创建类型的 new 实例(特别是不可变类型),而不是修改现有实例。 / p>
答案 1 :(得分:3)
除非Maze派生自定义setName(String)
的其他类,否则Maze setName(String name)
签名应完全可以接受
注意:您应该写this.name = name;
更新:事实证明,Maze 派生自Panel
(源自Component
)。由于Component.setName(String)
将其返回类型指定为void
(void setName(String)
),因此您无法在类中为void
指定任何其他返回类型,setName()
。原因是继承:如果有人通过Maze
引用(例如Component
)引用了您的Component c = new Maze();
对象,并且调用了setName()
,则运行时知道会打电话给您,因为继承。但是,您的版本返回一个值,运行时必须使用该值,但代码不是为它准备的(它是在Component
知识的情况下编译的。