gpt4 book ai didi

java - 函数式接口(interface)继承怪癖

转载 作者:IT老高 更新时间:2023-10-28 21:02:20 24 4
gpt4 key购买 nike

我有一个使用了一段时间的自定义界面,看起来像这样:

public interface Function<T, R> {
R call(T input);
}

我想用 Java 的 Function 来改造这个接口(interface)。以及 Guava 的Function , 同时保持 FunctionalInterface .我以为我有完美的安排:

@FunctionalInterface
public interface Function<T, R> extends
java.util.function.Function<T, R>,
com.google.common.base.Function<T, R> {

R call(T input);

@Override
default R apply(T input) {
return call(input);
}
}

两个超接口(interface)都声明了相同的apply()方法,这个方法已经在我的接口(interface)中实现了,只剩下抽象的call()方法。奇怪的是,它不会编译,告诉我

Invalid '@FunctionalInterface' annotation; Function<T,R> is not a functional interface

更奇怪的是,以下变体编译得很好:

@FunctionalInterface
public interface Function<T, R> extends
java.util.function.Function<T, R> {

R call(T input);

@Override
default R apply(T input) {
return call(input);
}
}

@FunctionalInterface
public interface Function<T, R> extends
com.google.common.base.Function<T, R> {

R call(T input);

@Override
default R apply(T input) {
return call(input);
}
}

public interface Function<T, R> extends
java.util.function.Function<T, R>,
com.google.common.base.Function<T, R> {

R call(T input);

@Override
default R apply(T input) {
return call(input);
}
}

@FunctionalInterface
public interface Function<T, R> extends
java.util.function.Function<T, R>,
com.google.common.base.Function<T, R> {

@Override
R apply(T input);
}

第一个版本无法编译是否有原因?

最佳答案

如评论中所述,它可以与 oracle 编译器一起正常编译。这是一个 Eclipse 错误。

等待错误修复,我个人将删除注释 @FunctionalInterface(您的第 3 个变体):

public interface Function<T, R>
extends
java.util.function.Function<T, R>,
com.google.common.base.Function<T, R> {

R call(T input);

@Override
default R apply(T input) {
return call(input);
}
}

此解决方案的主要不便之处在于 eclipse 编译器错误阻止将 Function 用作 lambda target type .


如果你真的想在 Function 上保留 @FunctionalInterface,一个(丑陋的)解决方法可能是引入一个中间接口(interface):

public interface AdapterFunction<T, R>
extends
java.util.function.Function<T, R>,
com.google.common.base.Function<T, R> {
@Override
default R apply(T input) {
return null;
}
}

并让您的 Function 扩展此 AdapterFunction:

@FunctionalInterface
public interface Function<T, R>
extends
AdapterFunction<T, R> {

R call(T input);

@Override
default R apply(T input) {
return call(input);
}
}

在这种情况下,Function 也是 eclipse 的有效目标类型:

Function<String, Object> function = st -> st.toString();

关于java - 函数式接口(interface)继承怪癖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30634543/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com