0

このコードを例として考えてみましょう。

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)
4

2 に答える 2

8

あなたが与えたコードは問題ないはずです。

ただし、問題は、実際のコードがを拡張するクラスであり、をオーバーライドComponentしようとしていることだと思います。 setName

withNameおそらく代わりに、次のようなメソッドを作成できます。

public Maze withName(String name) {
    setName(name); // Inherited method
    return this;
}

...ただし、APIでは、既存のインスタンスを変更するのではなく、型(特に不変の型)の新しいwithXyzインスタンスを作成するためによく使用されることに注意してください。

于 2012-04-16T10:41:03.443 に答える
3

Mazeが定義された他のクラスから派生していない限りsetName(String)Maze setName(String name)署名は完全に受け入れられるはずです。

注:あなたは書くべきですthis.name = name;

更新:結局のところ、MazePanel(から派生している)から派生していますComponentComponent.setName(String)リターンタイプをvoid( )として指定しているためvoid setName(String)、他のリターンタイプを指定することはできませんが、クラス内で指定できます。理由は継承です。誰かが参照(たとえば)を介してオブジェクトへの参照を持っていて、を呼び出す場合、継承のためにランタイムはあなたを呼び出すことを知っています。ただし、バージョンは値を返します。これを使用してランタイムが何かを実行する必要がありますが、コードはその値に対して準備されていません(。の知識を使用してコンパイルされています。voidsetName()MazeComponentComponent c = new Maze();setName()Component

于 2012-04-16T10:41:40.937 に答える