2017-08-25 115 views
2

我正在尝试处理Java8方法引用,并遇到非常奇怪的编译错误。Java8方法引用和泛型,在某些情况下需要类型转换

我有一个对象值的地图,我想提供给用户在值上应用一些函数。

所以我用这需要地图键和功能接口作为参数

我很奇怪,为什么我不需要投方法参照精确的实型(在微调的情况下)

泛型方法
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))); 
     } 
    } 
} 

结果:

{键1 =一些文本,在开始空间,键2 = AAAAAAAAAAAAAA} {键1 =一些 文本无线个空的开始,键2 = aaaaaaaaaaaaaa}

+5

你忘了提及你有哪些编译错误完全吻合。这可能与'toLowerCase'有两个重载的事实有关,但是我们不能没有错误就知道。请[编辑]你的问题,并包括这一点。 – RealSkeptic

+0

将其添加到代码中。似乎奇怪为什么它可以解决铸造后的方法,如果有2个 – Limmy

+1

这个编译错误听起来像@RealSkeptic有关重载的理论可能是正确的:https://ideone.com/I1Y7Am – Radiodef

回答

1

答案在评论这个问题已经给出 - 是的,问题是Java无法决定类应使用的方法从字符串(有两个 - 一个没有参数,另一个与区域设置)。

这也与推断方法类型参数有关。在提供的代码JRE的上下文中不能这样做。

参见:

相关问题