Java8方法参考和泛型,在某些情况下需要输入类型

时间:2017-08-25 16:28:26

标签: java generics lambda java-8 method-reference

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

我有一个包含对象值的地图,我想让用户在值上应用一些函数。

所以我使用了将map键和功能接口作为参数

的泛型方法

我想知道为什么我不需要将方法引用转换为精确的实际类型(如果是修剪)

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 =开头有空格的一些文字,key2 = AAAAAAAAAAAAAA} {key1 = some   开头有空格的文字,key2 = aaaaaaaaaaaaaa}

1 个答案:

答案 0 :(得分:1)

问题的评论中已经给出了答案 - 是的,问题是Java无法决定应该使用 String 类中的哪个方法(有两个 - 没有arg和第二个使用区域设置)。

这也与推断方法类型参数有关。在提供代码的上下文中,JRE无法做到这一点。

另见: