gpt4 book ai didi

java - Java 中破坏逆变边界的安全解决方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:19:33 25 4
gpt4 key购买 nike

Bounding generics with 'super' keyword 中所述当涉及方法泛型的下限时,Java 类型系统已损坏/不完整。由于 Optional 现在是 JDK 的一部分,我开始更多地使用它,而 Guava 使用他们的 Optional 遇到的问题开始成为我的痛苦。我想出了一个体面的工作,但我不确定它是否安全。首先,让我设置示例:

public class A {}
public class B extends A {}

我希望能够声明如下方法:

public class Cache {
private final Map<String, B> cache;
public <T super B> Optional<T> find(String s) {
return Optional<T>.ofNullable(cache.get(s));
}
}

因此以下两项都有效:

A a = cache.find("A").orElse(new A())
B b = cache.find("B").orElse(new B())

作为解决方法,我有一个静态实用方法,如下所示:

public static <S, T extends S> Optional<S> convertOptional(Optional<T> optional) {
return (Optional<S>)optional;
}

那么我的最后一个问题是,这是否与上面的“理想”代码一样类型安全?

A a = OptionalUtil.<A,B>convertOptional(cache.find("A")).orElse(new A());

最佳答案

您实际上是在尝试查看 Optional<B>作为 Optional<A> 返回不改变返回类型(因为你不能使用 super )。我只想 map identity function .

A a = cache.find("A").map(Function.<A> identity()).orElse(new A());
// or shorter
A a = cache.find("A").<A> map(x -> x).orElse(new A());

不过,我认为您的方法没有任何问题。

关于java - Java 中破坏逆变边界的安全解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31796383/

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