Guava的toStringFunction()具有以下声明:
public static Function<Object, String> toStringFunction() { ... }
所有非原始根在Object中,因此该函数运行良好。
但是当我尝试将其与另一个函数组合使用时,例如:
Function<Integer, Double> f1 = Functions.compose(Functions.forMap(someMap),
Functions.toStringFunction());
在这里,someMap变量是一个map<String, Double>,因此我期望toStringFunction将整数转换为字符串,然后forMap将字符串转换为双精度浮点数。 但是,我收到了编译器错误:
Function<Integer, Double> f1 = Functions.compose(Functions.forMap(someMap),
^
required: Function<Integer,Double>
found: Function<Object,Double>
2 errors
我的两个问题是:
1.如何明确告诉编译器toStringFunction应该是Function < Integer,String>类型?简单的强制转换不起作用,我正在寻找这两个函数的真正组合。
Function< Integer, String> g1 = (Function< Integer, String>)Functions.toStringFunction();
// cause error
2.如果toStringFunction写成以下形式:
@SuppressWarnings("unchecked")
public static <E> Function<E, String> toStringFunction(){
return (Function<E, String>) ToStringFunction.INSTANCE;
}
// enum singleton pattern
private enum ToStringFunction implements Function<Object, String>{
INSTANCE;
// @Override public String toString(){
// return "Functions.toStringFunction()";
// }
@Override public String apply(Object o){
return o.toString();
}
}
我可以指定类型:
Function<Integer, Double> f1 = Functions.compose(Functions.forMap(someMap),
Functions.<Integer>toStringFunction());
这个版本可以正常工作。但是Guava团队现在的版本有什么动机呢?
Functions.compose
在第二个参数的输出类型中使用了通配符以允许一定的灵活性,因此虽然你不能编写Functions.<Integer> toStringFunction()
,但可以通过编写Functions.compose(Functions.toStringFunction(), Functions.<Integer> identity())
来创建一个整数到字符串的函数。当然,在Java 8中,你可以直接写Integer::toString
。 :-) - ruakhMap<K, V>
的Map.get(key)
方法中的key
是Object
类型,我不明白为什么 Guava 团队会有任何不同 :P 现在,说正经的,我认为这是一个错误或者很久以前做出的决定,已经证明不是最好的。 - fps