gpt4 book ai didi

java - 有没有办法泛化 lambda?

转载 作者:行者123 更新时间:2023-12-02 10:01:42 25 4
gpt4 key购买 nike

我正在尝试编写一个 lambda 来实现 @FunctionalInterface (本例中为 BiFunction )并将返回一个用 <T> 生成的对象。

我可以使用声明泛型类的旧方法来做到这一点(请参阅 class Extractor<T> ),但我不明白如何使用 lambda 来做到这一点。我唯一能做的就是声明一个带有“未知”的 lambda <?>泛型类型。

基本上,我想声明一个可以传递给 method2 的 lambda 。可能吗?

private BiFunction<String, Root<Employee>, Path<?>> extractorLambda = 
(fieldName, root) -> root.get(fieldName);

class ExtractorClass<T> implements BiFunction<String, Root<Employee>, Path<T>> {
@Override
public Path<T> apply(final String fieldName, final Root<Employee> root) {
return root.get(fieldName);
}
}

private Specification<Employee> method1(String fieldName,
BiFunction<String, Root<Employee>, Path<?>> extractor) {
return null;
}

private <T> Specification<Employee> method2(String fieldName,
BiFunction<String, Root<Employee>, Path<T>> extractor) {
return null;
}


public void main(String[] args) {
method1("s", extractorLambda); // ok
method2("s", extractorLambda); // error
ExtractorClass<String> extractorClass = new Extractor<>();
method2("s", extractorClass); // ok
}

最佳答案

问题在于 <T> 之间的差异和<?> .

您的方法2需要一种类型的对象列表。 <?>是无界通配符,这意味着它可以包含任何内容,只要它扩展了 Object。

同样适用于其他方向。如果您尝试将 Extractor 类与 method1 一起使用,它将无法编译,因为该类表示它仅适用于特定类型的列表。

据我所知,您不能在字段上进行泛型类型定义。根据您的评论,这看起来是最短的解决方法:

    private interface E2<T> extends BiFunction<String, Root<Employee>, Path<T>>{}
private static final E2 EXTRACTOR = (fieldName, root) -> root.get(fieldName);

关于java - 有没有办法泛化 lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55574105/

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