Java functional generics
映射的ComputeFabSent方法具有以下声明:
computeIfAbsent(K key, Function super K,? extends V> mappingFunction)。
当k和v类型不在其他地方使用时,为什么不将参数声明为Function?
现在我知道k和v非常重要,它们是map类声明的一部分。
- 通常是为了明确什么是可接受的。例如,只要super类是k,就可以将任何东西传递给函数;对于第二个参数,只要它扩展v,就可以传递给它;否则,它可能会导致错误的概念。
- K和V是Map的参数,为什么不使用?
- 从这里开始是值得一看的。我甚至会说这个问题是重复的。
简单的例子:
1 2 3
| Map <String,Object > myMap = ...
Function<Object,String > myFunc = Object::toString ;
myMap. computeIfAbsent("42", myFunc ); |
这是可接受的吗?
好的,Functionmyfunc是给定的类型,和我们有一个Map,这听起来像有一个问题。它肯定不会,如果你只接受Function编译。
但当你看它的接近,有没有什么错的。不仅是demonstrably工作的代码,它是易于"42"湖:为什么它是String实例,它有一toString()方法。一个方法是String归来,在Object学院。这当然很好。
这是一个"细"表达的是什么Function super K, ? extends V>尼斯。
- 实际上,如果方法的参数声明为Function,那么myMap.computeIfAbsent("42", Object::toString)仍然是编译的,因为编译器足够聪明,可以将Object::toString绑定为Function,例如,您也可以在不出错的情况下编写Function f = Object::toString;。这就是为什么lambda表达式和方法引用都是不好的例子。尝试现有的函数,例如computeIfAbsent(myMap,"42", Function.identity())将不再编译。但是,这些问题只是"什么是pecs"的复制品……
- @霍尔格,你当然是对的。我来修正这个例子。
K和V是部分类型的映射功能。所以他们是实际使用。特别是,他们确定的可接受的和最通用的激活参数类型和返回类型的映射功能。
for
1
| Function<? super K,? extends V> mappingFunction |
这意味着你可以通任何功能,是能够映射到至少都可以作为一个关键的地图和地图制作? super K)到这些键的值可以到地图(extends V(看跌)。这给你更多的灵活性,在效果中选择的映射功能。
在理论方面:在更多的子函数在其参数是表征逆变和协变返回类型其类型。本determines类型有关。当mappingFunctionFunction super K,? extends V>Mapas a function to V从K。