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