我可以使用lambdas覆盖JDK8中的功能接口的toString方法

时间:2013-05-14 13:30:48

标签: java lambda java-8

我可以覆盖功能界面的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吗?

3 个答案:

答案 0 :(得分: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返回值(如果有的话)并生成带有另一个功能接口的自定义字符串。

答案 1 :(得分:5)

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

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

答案 2 :(得分:0)

每个Lambda Expression都实现一个@FunctionalInterface。因此,您总是可以选择传递具有相同类型的接口而不是lambda本身。您甚至可以创建此接口的新实现(匿名内部类,内部类或独立类)。 但是,如果您关心lambdas的语法或传递方法引用的内容,您还可以尝试以下Creating String representation of lambda expression的答案之一 或Naming(toString) Lambda-Expressions for Debugging purpose