gpt4 book ai didi

java - 为什么泛型不能应用于相同的签名?

转载 作者:行者123 更新时间:2023-11-29 08:20:36 25 4
gpt4 key购买 nike

我有以下代码片段,乍一看它应该可以工作,但我收到了非常有趣的错误:

'apply(capture<? extends Generic.MyClass>)' in 'java.util.function.Function' cannot be applied to '(capture<? extends Generic.MyClass>)'

此错误发生在这里:function.apply(wrapper.value);

我错过了什么?

public class Generic {

public static void main(String[] args) {
Wrapper wrapper = new Wrapper<>(new MyClass());
}

private static void method(Wrapper<? extends MyClass> wrapper) {
Function<? extends MyClass, String> function = (MyClass m) -> m.getClass().toString();
function.apply(wrapper.value);
}

static class Wrapper<T extends MyClass> {
private final T value;

Wrapper(T value) {
this.value = value;
}
}

static class MyClass {

}

}

最佳答案

将变量类型改为(*):

Function<MyClass, String>

? extends MyClass 表示此函数接受 MyClass 的特定子类,但您只是不知道是哪一个。

虽然错误消息使类型看起来相同,但它们不是:每个 ? extends MyClass 指的是不同的(但特定的)类型。

您唯一可以安全地传递给此函数的是文字 null

缩写PECS告诉您 extends 用于生产者方法(例如“wrapper produces value”)。它不用于消费者方法(例如“函数接受 T 作为参数”):这就是 super 的用途。


(*) 或者只使用 wrapper.value.getClass().toString();,而不用声明函数。

关于java - 为什么泛型不能应用于相同的签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59077265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com