我刚刚发现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;
}
}
这是非常灵活的。
但为什么他们没有将其扩展到其他情况呢?
例如:
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;
}
};
}
}
编译失败:
Type mismatch: cannot convert from Function<Object,Integer> to Function<String,Object>
这是泛型的一个简单限制。类型系统不知道哪个Object
and Integer
是返回类型和参数类型,因此它不能执行任何协变/逆变智能。
如果你想表达“一个需要超类型的函数X
并返回子类型Y
" you do Function<? super X, ? extends Y>
。事实上,如果你改变
Function<String, Object> function = function();
to
Function<? super String, ? extends Object> function = function();
你的代码可以编译。 (? extends Object
与?
但为了清楚起见我把它写出来了)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)