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

Mat*_*ace 9 java generics

正如Bounding泛型中使用'super'关键字所讨论的那样,当涉及到方法泛型的下限时,Java类型系统被破坏/不完整.由于Optional现在是JDK的一部分,我开始更多地使用它,并且Guava遇到的问题与他的可选性开始变得困难.我提出了一个体面的工作,但我不确定它是否安全.首先,让我设置一个例子:

public class A {}
public class B extends A {}
Run Code Online (Sandbox Code Playgroud)

我希望能够声明一个方法,如:

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));
   }
}
Run Code Online (Sandbox Code Playgroud)

以下两项工作:

A a = cache.find("A").orElse(new A())
B b = cache.find("B").orElse(new B())
Run Code Online (Sandbox Code Playgroud)

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

public static <S, T extends S> Optional<S> convertOptional(Optional<T> optional) {
    return (Optional<S>)optional;
} 
Run Code Online (Sandbox Code Playgroud)

所以我的最后一个问题是,这是上述"理想"代码的类型安全吗?

A a = OptionalUtil.<A,B>convertOptional(cache.find("A")).orElse(new A());
Run Code Online (Sandbox Code Playgroud)

Sot*_*lis 5

您有效地尝试在不更改返回类型Optional<B>Optional<A>情况下查看返回的内容(因为您无法使用super).我只想map身份功能.

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());
Run Code Online (Sandbox Code Playgroud)

我认为你的方法没有任何问题.