gpt4 book ai didi

java - 为 Supplier

转载 作者:行者123 更新时间:2023-12-02 15:28:36 27 4
gpt4 key购买 nike

为什么不能编译? :

import java.util.Optional;

public class Demo {

Optional<? extends SomeValue> getOption() {
return Optional.empty();
}

void exposure() {
SomeValue someValue = getOption().orElseGet(() -> new SomeValue());
}
}

class SomeValue {}

它在 getOption() 时没有问题会返回 Optional<SomeValue> .

最佳答案

这是相当受限的方法签名的结果:

public T orElseGet(Supplier<? extends T> other) {

在你的例子中,T? extends SomeValue 这是一个未知类型,可分配给 SomeValue (但可能是它的子类)。 orElseGet 的签名意味着允许您的供应商返回 T 的子类型,其总体结果类型为 T 但它不允许扩展到 T 的通用基类型和您的供应商返回的类型(如果您的供应商返回 SomeValue 并且 T ? extends SomeValue,通用基类型为 SomeValue)。

您可以通过插入允许扩大类型的操作来解决此问题:

SomeValue someValue = getOption()
.map(Function.<SomeValue>identity()).orElseGet(() -> new SomeValue());

identity 函数不会改变值,但是映射操作允许传入一个使用更广泛类型的函数,即映射函数可以声明使用 SomeValue当实际输入类型是 时?扩展 SomeValue 并且返回类型是 SomeValue


但是一般来说,为了避免这样的问题,方法的返回类型中不应该有通配符,所以改

Optional<? extends SomeValue> getOption()

Optional<SomeValue> getOption()

参见 http://docs.oracle.com/javase/tutorial/java/generics/wildcardGuidelines.html

Using a wildcard as a return type should be avoided because it forces programmers using the code to deal with wildcards.

关于java - 为 Supplier<? 使用 lambda 时编译失败扩展类型>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29104218/

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