Java8 方法参考和泛型,在某些情况下需要类型转换
Java8 Method Reference and generics, type cast needed in some cases
我正在尝试处理 Java8 方法引用并遇到非常奇怪的编译错误。
我有一个包含对象值的地图,我想提供给用户以对值应用一些函数。
所以我使用了将映射键和功能接口作为参数的通用方法
而且我想知道为什么我不需要将方法引用转换为精确的真实类型(在 trim 的情况下)
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 class 中的哪个方法应该是使用(有两个 - 一个没有参数,第二个使用 Locale)。
这也与方法类型参数的推断有关。在提供的代码上下文中,JRE 无法执行此操作。
另请参阅:
- Oracle docs
- Answer to SO question about method reference type
我正在尝试处理 Java8 方法引用并遇到非常奇怪的编译错误。
我有一个包含对象值的地图,我想提供给用户以对值应用一些函数。
所以我使用了将映射键和功能接口作为参数的通用方法
而且我想知道为什么我不需要将方法引用转换为精确的真实类型(在 trim 的情况下)
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 class 中的哪个方法应该是使用(有两个 - 一个没有参数,第二个使用 Locale)。
这也与方法类型参数的推断有关。在提供的代码上下文中,JRE 无法执行此操作。
另请参阅:
- Oracle docs
- Answer to SO question about method reference type