gpt4 book ai didi

java - 将泛型类型参数标记为 Java 8 中的功能接口(interface)

转载 作者:搜寻专家 更新时间:2023-11-01 01:42:58 24 4
gpt4 key购买 nike

我想将函数的类型参数限制为函数式接口(interface)。

像这样:

public static <@FunctionalInterface T extends Function<A, B>> T foo () {
return a -> bar;
}

此处不允许使用@FunctionalInterface

目的是使返回具有类型参数类型的 lambda 成为可能。由于 T 可以是普通类,因此不允许返回 lambda。

是否可以将类型参数限制为功能接口(interface)?

最佳答案

正如在 your other question 上讨论过的那样不可能那样做。不仅注释类型参数,而且特别是通过 lambda 表达式实现未知接口(interface)。

编译你的方法时

public static <@FunctionalInterface T extends Function<A, B>> T foo() {
return a -> bar;
}

编译器必须生成能够返回适当类型实例的代码,但它不知道 T 是什么,因为这取决于 foo() 的调用者> 但是编译 foo() 和编译 foo() 的调用者之间没有联系。后者可能会在数年后发生在地球的另一边。

也许你不知道Type Erasure .您的方法 foo() 将只有一个编译版本,但它必须满足返回适当类型实例的通用契约。 不知道 T 是什么

这在返回现有实例时有效,例如在返回集合元素或作为参数传递的值之一时。但是泛型方法无法返回类型参数的新实例。不使用 new 也不使用 lambda 表达式。


请注意,如果您让知道类型的调用者执行“上层”操作,则仍然可以实现所需功能的子接口(interface)。假设您有一个通用工厂方法,例如:

public static <A,B> Function<A,B> getter(Map<?, ? extends B> map) {
return a->map.get(a);
}

此代码适用于未知类型 AB 以及 Map 的未知参数化,因为唯一的约束是方法 Map.get 接受 A 的实例,它接受 anything 并返回 B 的实例,它像 any输入? extends B 将分配给 B

现在,如果您的调用者具有 Function 的任意子类型,X,例如

interface X extends Function<String, Integer> {}

它可以使用您的工厂方法生成 X 的实例,装饰 函数,例如:

Map<String, Integer> map=new HashMap<>();
X x=getter(map)::apply;
x.apply("foo");

在这里,X 是一个函数式接口(interface) 的约束在调用方站点上被检查。

关于java - 将泛型类型参数标记为 Java 8 中的功能接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24382343/

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