在尝试使用泛型、通配符和函数式编程的一段代码时,我有一个疑问,下面是一个简单的程序
import java.util.function.Function;
public static void main(String[] args) {
String x = "";
String y = getFormData().apply(x);
}
private static Function<?, String> getFormData() {
return x -> ((String) x).concat("asd");
}
上面的程序抛出了一个错误
String y = getFormData().apply(x);
apply (capture<?>)
inFunction
cannot be applied to (java.lang.String
)
但是如果我将 getFormData() 函数更改为
private static Function<? super String, String> getFormData() {
return x -> ((String) x).concat("asd");
}
错误消失了。
有人可以解释为什么会发生这种情况吗?我知道<? super String>
意味着任何 String 的父类(super class)型或 String 本身。
最佳答案
您的方法的第一个版本:
Function<?, String> getFormData() {...}
可以返回Function<Integer, String>
。那么这个函数显然不能应用于 String
!
但是在第二种情况下:
Function<? super String, String> getFormData() {...}
不允许返回 Function<Integer, String>
.
关于Java 通配符通用,在 <? 上没有出现错误super String> 但否则错误为 "cannot be applied to Java.lang.String",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44705897/