返回类型不兼容:Mutators&方法链接

时间:2012-04-16 10:38:13

标签: java method-chaining

让我们将这段代码视为我们的例子:

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)

2 个答案:

答案 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)将其返回类型指定为voidvoid setName(String)),因此您无法在类中为void指定任何其他返回类型,setName()。原因是继承:如果有人通过Maze引用(例如Component)引用了您的Component c = new Maze();对象,并且调用了setName(),则运行时知道会打电话给您,因为继承。但是,您的版本返回一个值,运行时必须使用该值,但代码不是为它准备的(它是在Component知识的情况下编译的。