给定如下 API:
class Bar { ... }
class Foo extends Bar { ... }
在 Java 的 Optional
类型中,我们可以说:
Optional<Foo> fooOption = ...
fooOption.orElse(aFoo) // returns something of type Foo
但是,由于 Foo
是一个 Bar
,我希望能够说:
Optional<Foo> fooOption = ...
fooOption.orElse(aBar) // returns something of type Bar
作为练习,我想用另一种类型来完成:
public abstract class Option<T> {
// this doesn't compile
public abstract <U super T> U orElse(U other);
}
我如何重写它来编译,同时支持在需要时扩大类型的能力?
最佳答案
But, since
Foo
is aBar
但是Bar
不是 Foo
.我的意思是您可以这样做:
Optional<Bar> fooOpt = Optional.of(new Foo());
Bar bar = fooOpt.orElse(new Bar());
但是你不能用 Optional<Foo>
做同样的事情因为它违反了 Optional.orElse
的类型约束方法。
在 Option<T>
的假设实现中你应该明确定义 U
作为 T
的父类(super class)型
public class Option<U, T extends U> {
T value;
public U orElse(U other) {
if (value != null) {
return value;
}
return other;
}
}
在那种情况下你可以写这样的代码
Option<Foo, Bar> fooOpt = Option.of(new Foo());
Bar bar = fooOpt.orElse(new Bar());
关于java - 给定 `T` 和 `U` 其中 `T extends U` 如何返回 `U`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39277392/