2

我可以覆盖功能接口的 toString 方法吗?或者改写。是否有优雅的方法来更改实现功能接口并使用 lambdas 覆盖 toString 方法的匿名内部类?在JDK8中创建lamba表达式时可以覆盖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
}

当然,在实践中,使用比字符串更有趣的东西会很有趣。从 doIt (如果有的话)捕获参数和返回值并使用另一个功能接口生成自定义字符串并不需要太多代码。

于 2015-01-25T07:02:40.117 回答
5

不,lambda 表达式用于表达一种方法接口,就好像它们只是函数一样。它是用 Java(一种 OOP 语言)实现的功能语言的一个元素。

要覆盖 toString,您必须在类中实现接口。

于 2013-05-14T13:35:50.817 回答
1

每个 Lambda 表达式都实现一个 @FunctionalInterface。因此,您始终可以选择传递具有相同类型的接口而不是 lambda 本身。您甚至可以创建此接口的新实现(匿名内部类、内部类或独立类)。但是,如果您关心 lambda 的语法或传递方法引用的内容,您也可以尝试以下答案之一来创建 lambda 表达式的字符串表示Naming(toString) Lambda-Expressions for Debugging purpose

于 2017-03-19T07:10:39.627 回答