Java8 方法引用和泛型,某些情况下需要类型转换

标签 java generics lambda java-8 method-reference

我正在尝试处理 Java8 方法引用并遇到非常奇怪的编译错误。

我有一个包含对象值的映射,我想为用户提供对值应用一些函数的功能。

所以我使用了以映射键和功能接口(interface)为参数的泛型方法

我想知道为什么我不需要将方法引用转换为精确的实数类型(在修剪的情况下)

import java.util.HashMap;
import java.util.Map;
import java.util.function.UnaryOperator;

public class ReferenceDiscovering {

    Map<String, Object> values = new HashMap<>();

    public static void main(String[] args) {
        ReferenceDiscovering main = new ReferenceDiscovering();
        main.values.put("key1", " some text with space in start");
        main.values.put("key2", "AAAAAAAAAAAAAA");

        System.out.println(main.values);

        main.applyFunctionByKey("key1", String::trim);
        //        cannot resolve method toLowerCase
        //        COMPILE ERROR HERE. WHY???? WHY NOT FOR trim?
        //        main.applyFunctionByKey("key2", String::toLowerCase);
        main.applyFunctionByKey("key2", (UnaryOperator<String>)String::toLowerCase);


        System.out.println(main.values);
    }

    private <T> void applyFunctionByKey(String key, UnaryOperator<T> binaryOperator) {
        if (values.containsKey(key)) {
            values.put(key, binaryOperator.apply((T)values.get(key)));
        }
    }
}

结果:

{key1= some text with space in start, key2=AAAAAAAAAAAAAA} {key1=some text with space in start, key2=aaaaaaaaaaaaaa}

最佳答案

问题的评论中已经给出了答案 - 是的,问题是 Java 无法决定应该使用 String 类中的哪个方法(有两个 - 一个没有参数,第二个使用语言环境)。

这也与方法类型参数的推断有关。在提供的代码上下文中,JRE 无法执行此操作。

另见:

关于Java8 方法引用和泛型,某些情况下需要类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45885776/

相关文章:

c++ - 为什么 lambda 对象中的局部变量是 const?

c# - 动态 where 子句的最简单方法

Java - 扫描仪闲置

java - Jsf动态添加/删除c中的组件:forEach loop

c# - 在 C# 中使用 `where T : SOMETHING` 结构

javascript - typescript 如何将泛型分配给泛型变量字段

java - 等待空闲对象 Apache 连接池超时

java - 从线程中的 Pixmap 对象创建纹理时,纹理为空

java - 反射 - Method::get Generic Return Type no generic - 可见性

python - 修改python中的函数而不调用它