我想让Map值解析延迟,所以考虑为供应商提供toString函数。但是下面的代码不能编译:
默认方法不能覆盖java.lang.Object
中的方法
任何人都知道如何以一种整洁的方式解决这个问题?
@FunctionalInterface
private static interface ToStringSupplier extends Supplier<String>
{
default public String toString() {
return get();
}
}
我想要的原因是我的消费者(位于另一个存储库中)首先可以更新他们的代码:
自:
String value = (Strint)map.get(key);
要:
String value = map.get(key).toString();
之后我可以将实现更改为惰性方法:
自:
String value = expensiveCalculation();
map.put(key,value);
要:
Supplier<String> supplier () -> expensiveCalculation();
map.put(key, supplier);
答案 0 :(得分:1)
我发现下面的代码可以解决我的问题:
private static Object getToString(Supplier<String> s) {
return new Object()
{
@Override
public String toString() {
return s.get();
}
};
}
Supplier<String> supplier = () -> expensiveCalculation();
map.put(key, getToString(supplier));
答案 1 :(得分:1)
正如路易斯·瓦瑟曼(Louis Wasserman)在问题的评论部分中提到的那样,不可能用default
覆盖实例方法。可以通过将#toString
调用委托给所提供的供应商的#get
方法的新类来完成。
这是可以完成的方法:
import java.util.Map;
import java.util.function.Supplier;
class Scratch {
public static final class ToStringSupplier implements Supplier<String> {
private final Supplier<String> supplier;
public ToStringSupplier(Supplier<String> supplier) {
if (supplier == null) {
throw new NullPointerException();
}
this.supplier = supplier;
}
@Override
public String toString() {
System.out.println("Invoked ToStringSupplier#toString.");
return get();
}
@Override
public String get() {
System.out.println("Invoked ToStringSupplier#get.");
return supplier.get();
}
}
public static void main(String[] args) {
final var supplier = new ToStringSupplier(() -> {
System.out.println("Invoked Supplier#get.");
return "The result of calculations.";
});
final var key = "key";
final var map = Map.of(key, supplier);
System.out.println("The map has been built.");
final var calculationResult = map.get(key).toString();
System.out.println(calculationResult);
System.out.flush();
}
}
输出为:
The map has been built.
Invoked ToStringSupplier#toString.
Invoked ToStringSupplier#get.
Invoked Supplier#get.
The result of calculations.
答案 2 :(得分:-4)
default是switch语句中的保留字
您可能想要使用抽象