我不想让普通的 lambda 实现一个方法并将它的 toString 重新定义为附加值。我希望 lambda 表达式只实现 toString 方法。 我知道我表达得不是很好,但我相信你会通过这个例子理解我的意思。
public class LambdaToStringTest {
public interface ToStringInterface {
public abstract String toString();
}
public static void main(String[] args) {
print("TRACE: %s", (ToStringInterface)()->someComputation()); // <<-- ERROR: The target type of this expression must be a functional interface
}
private static void print(String format, Object... args) {
System.out.println(String.format(format, args));
}
}
如果我更改方法的名称,它会编译,但它不会覆盖 toString,因此 print 方法不会打印预期的内容。
这是尝试定义一个日志子系统,它仅在需要时(真正要打印时)评估 lambda,但与非 lambda 参数兼容。我知道实现它的其他方法,但我想知道为什么我不能这样做,如果有解决方法或者我做错了什么,
最佳答案
简短的回答,你不能。 @FunctionalInterface
不能用于“覆盖”Object
的方法。
但是,您可以使用虚拟扩展方法实现 Formattable
。注意:以下代码未经测试:
@FunctionalInterface
public interface ToStringInterface
extends Formattable
{
String asString();
@Override
default void formatTo(Formatter formatter, int flags, int width, int precision)
{
formatter.format("%s", this);
// Or maybe even better:
formatter.out().append(this.asString());
}
}
我提出这个解决方案是因为您正在使用利用此接口(interface)的 String.format()
。
或者您可以只定义自己的接口(interface)。或者甚至为此接口(interface)编写一个包装器,在 .asString()
中调用 .toString()
。选择很多。
关于java - 如何让 lambda 表达式在 Java 8 中定义 toString?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23628631/