我刚刚发现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)
这是泛型的简单限制.该型系统不知道的Object
和Integer
是返回类型和参数类型,因此它不能做任何的协方差/逆变机灵.
如果你想表达"一个超类型的函数,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
与?
我相同,但为了清楚起见我写了出来)
归档时间: |
|
查看次数: |
251 次 |
最近记录: |