Java 方法参考,协方差对方差
我刚刚发现Java 方法参考,协方差对方差,java,java-8,Java,Java 8,我刚刚发现Java8允许引用具有更具体返回类型和更通用参数的方法 import java.util.function.Function; public class MethodReferences { public static Integer function(Object o) { return 2; } public static void main(String[] args) { Function<String, Obj
Java8
允许引用具有更具体返回类型和更通用参数的方法
import java.util.function.Function;
public class MethodReferences {
public static Integer function(Object o) {
return 2;
}
public static void main(String[] args) {
Function<String, Object> function = MethodReferences::function;
}
}
import java.util.function.function;
公共类方法引用{
公共静态整数函数(对象o){
返回2;
}
公共静态void main(字符串[]args){
Function=MethodReferences::Function;
}
}
这是非常灵活的
但他们为什么不把这一点推广到其他情况呢
例如:
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<String, Object> function = function();
}
private static Function<Object, Integer> function() {
return new Function<Object, Integer>() {
@Override
public Integer apply(Object o) {
return 1;
}
};
}
}
import java.util.function.function;
公共班机{
公共静态void main(字符串[]args){
函数=函数();
}
私有静态函数{
返回新函数(){
@凌驾
公共整数应用(对象o){
返回1;
}
};
}
}
编译失败:
Type mismatch: cannot convert from Function<Object,Integer> to Function<String,Object>
类型不匹配:无法从函数转换为函数
这是泛型的一个简单限制。类型系统不知道对象
和整数
中的哪一个是返回类型和参数类型,因此它不能进行任何协方差/逆变智能
如果要表示“接受超类型
X
并返回子类型Y
”的函数,则函数函数在参数类型中应始终是逆变的,在返回类型中应始终是协变的
A1的A2实例和B2的B1实例
然后
对于任何函数是一流公民的编程语言来说,这应该是正确的。函数不是Java中的第一类实体,因此语言设计者不可能强加这种差异。(显然,上面的intanceof在java中没有意义,因为它的功能不是任何东西的实例。它们只是java设计师在大数据和apache spark时代保持java相关性的最后一搏。所有“功能”特性都是从scala借用的
Function<String, Object> function = function();
Function<? super String, ? extends Object> function = function();
(A1 -> B1) instanceof (A2 -> B2) // A1 -> B1 means function that takes argument of type A1 and returns value of type B1