对不起,有点不清楚的标题,但希望你很快就会看到,它不是那么容易想出一个更好的:)
所以我有这个接口,通过定义一个新方法和一个默认的实现来扩展 Java Supplier @ FunctionalIntece。get()方法。
然后在我的代码中,我使用 lambda 表示法初始化了这个供应商的不同“版本”。例如:SomeSupplier s = () -> doSomething();
不知道为什么我甚至尝试过这个,因为从逻辑上讲,我不明白这是如何工作的,它确实如此。在我的脑海中,当我使用 lambda 这样定义我的供应商时,我基本上覆盖了 Supplier.get () 方法。那么,在实践中它似乎如何覆盖我的 SomeSupplier.getSome () 方并保留.get () 方法的默认 impl 不变?
我在这里错过了什么?
工作示例代码:
public static void main(String[] args) throws InterruptedException {
SomeSupplier s = () -> getSomeOrException(); // "implements" the Supplier.get(), right?
for (int i = 0; i < 100; i++) {
System.out.println(s.get()); // => "Some!" or "null"
Thread.sleep(2);
}
}
private static String getSomeOrException() throws SomeCheckedException {
if (System.currentTimeMillis() % 10 == 0) {
throw new SomeCheckedException("10 %!");
}
return "Some!";
}
private intece SomeSupplier extends Supplier<String> {
@Override
default String get() {
try {
return getSome();
}
catch (SomeCheckedException e) {
return e.getMessage();
}
}
String getSome() throws SomeCheckedException; // How is this overridden/implemented?
}
private static class SomeCheckedException extends Exception {
public SomeCheckedException(String message) {
super(message);
}
}
}```
您的错误是假设如果Supplier
的 Lambda 实现get
,那么SomeSupplier
的 lambda 也必须实现get
。
但是,Lambda 将始终实现将要实现的接口*的单个抽象方法。在Supplier
中,即get
。但是,您的SomeSupplier
具有实现的get
(使用default
方法)。因此getSome()
SomeSupplier s = () -> getSomeOrException();
是大致类似于此:
SomeSupplier s = new SomeSupplier() {
String getSome() throws SomeCheckedException() {
return getSomeOrException();
}
};
请注意,这实现了getSome
,而不是底层的get
方法。
*:这也是为什么函数式接口只能有一个抽象方法:如果给定的目标类型存在多个这样的方法,则没有回退逻辑来选择一个选项。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(37条)