正如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)
您有效地尝试在不更改返回类型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)
我认为你的方法没有任何问题.