2

関数型インターフェースの toString メソッドをオーバーライドできますか? または言い換えます。関数型インターフェースを実装し、ラムダで toString メソッドをオーバーライドする匿名の内部クラスを変更するエレガントな方法はありますか? JDK8 でラムバ式を作成するときに toString をオーバーライドできますか?

interface Iface {
    void do();
}

main() { 
    Iface iface = () -> /*do something*/
    System.out.println(iface); // I would like to see anything useful in output
}

iface の toString をオーバーライドできますか?

4

3 に答える 3

7

インターフェイスを所有している場合は、次のようなことができます

public interface Iface {
    void doIt();

    default Iface withToString(final String toString) {
        return new Iface(){
            public void doIt(){
                Iface.this.doIt();
            }

            public String toString(){
                return toString;
            }
        };
    }
}

public static void main(String... args){
    Iface iface = () -> {};
    iface = iface.withToString("anything useful");
    System.out.println(iface); // prints "anything useful" to output
}

もちろん実際には、単なる String よりも興味深いものを使用するのは楽しいことです。doIt からの引数と戻り値 (存在する場合) を取得し、別の関数インターフェイスを使用してカスタム文字列を生成するのは、それほど多くのコードではありません。

于 2015-01-25T07:02:40.117 に答える
5

いいえ、ラムダ式は、1 つのメソッド インターフェイスを単なる関数であるかのように表現するために使用されます。これは、Java (OOP 言語) で実装された関数型言語の要素です。

toString をオーバーライドするには、クラスにインターフェイスを実装する必要があります。

于 2013-05-14T13:35:50.817 に答える