方法参考,协方差逆变

gon*_*ard 2 java java-8

我刚刚发现java 8允许引用具有更具体的返回类型和更一般参数的方法.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这非常灵活.

但为什么他们没有将此扩展到其他案例?

例如:

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;
            }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

编译失败:

Type mismatch: cannot convert from Function<Object,Integer> to Function<String,Object>
Run Code Online (Sandbox Code Playgroud)

aio*_*obe 9

这是泛型的简单限制.该型系统不知道的ObjectInteger是返回类型和参数类型,因此它不能做任何的协方差/逆变机灵.

如果你想表达"一个超类型的函数,X并返回一个子类型Y"你做Function<? super X, ? extends Y>.事实上,如果你改变了

Function<String, Object> function = function();
Run Code Online (Sandbox Code Playgroud)

Function<? super String, ? extends Object> function = function();
Run Code Online (Sandbox Code Playgroud)

你的代码编译.(? extends Object?我相同,但为了清楚起见我写了出来)