让我们以这段代码为例:

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()的变异器方法。为何编译器输出:

The return type is incompatible with Component.setName(String)

最佳答案

除非Maze从定义setName(String)的其他类派生,否则Maze setName(String name)签名应该是完全可以接受的

注意:您应该写this.name = name;

更新:事实证明,迷宫是从Panel派生的(它是从Component派生的)。由于Component.setName(String)将其返回类型指定为voidvoid setName(String)),因此您不能指定任何其他返回类型,但必须在类中为void指定setName()。原因是继承:如果某人通过Maze引用(例如Component)引用了您的Component c = new Maze();对象,并调用了setName(),则由于继承,运行时知道要调用您的对象。但是,您的版本正在返回一个值,运行时必须使用该值执行某些操作,但是代码并未为此准备好(它是使用Component知识编译的。

10-02 22:51