Java函数式泛型
Java的泛型机制中出现了一个问题,即Java函数式泛型。这个问题的出现原因是因为K和V是映射函数类型的一部分,所以它们实际上是被使用的。具体来说,它们确定了映射函数的参数类型和返回类型的可接受和最一般的边界。
对于Function super K, ? extends V> mappingFunction来说,这意味着您可以传递任何能够将作为映射函数中的键的任何东西进行映射的函数(因此? super K),并将这些键映射到可以放入映射中的值(因此extends V)。实际上,这使您在选择映射函数时更加灵活。
更具有理论意义的是:在子类型化函数中,参数类型是逆变的,返回类型是协变的。当将Map
解决这个问题的方法是使用通配符来限定参数类型和返回类型的范围。通过使用 super K>和 extends V>通配符,我们可以在传递映射函数时获得更大的灵活性。
Java 泛型中的问题和解决方法
在上述代码中,我们定义了一个泛型的 Map 对象 myMap,其键的类型是 String,值的类型是 Object。然后我们定义了一个 Function 对象 myFunc,它将 Object 类型转换为 String 类型。接着我们调用了 myMap 的 computeIfAbsent 方法,传入了键值 "42" 和 myFunc。
这段代码的问题在于,myFunc 的类型是 Function
这种“没有问题”的情况正是由 Function super K, ? extends V> 表达的。实际上,即使我们将方法的参数声明为 Function
你说得对,我会修复这个示例。