Java 通配符通用,在 <? 上没有出现错误super String> 但否则错误为 "cannot be applied to Java.lang.String"

标签 java generics functional-programming wildcard

在尝试使用泛型、通配符和函数式编程的一段代码时,我有一个疑问,下面是一个简单的程序

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<?>) in Function 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/

相关文章:

java.lang.IllegalStateException : open 错误

java - 从存储库加载后实例化泛型类

java - T 具有不同类型的 ArrayList<T>

Scala:如果在匹配案例中

java - Dsun.java2d.trace 是如何工作的

java - Quickbooks 与 java API 集成

java - 未找到类异常hadoop

java - 覆盖 Java 泛型方法

c# - 为什么 C# 编译器不能从函数签名中推断泛型委托(delegate)?

recursion - 将 "almost tail position"中的递归调用移动到真正的尾部位置