java - 给定 `T` 和 `U` 其中 `T extends U` 如何返回 `U`

标签 java generics option-type

给定如下 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 a Bar

但是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/

相关文章:

java - 通用 setter 方法不兼容类型错误

java - 遍历链表?

java - Android - php mysql。没有更新值

java - Java中如何转换成时间戳格式?

haskell - 如何避免在 Haskell 中检查空值?

java - Optional<T> 当isPresent() 获取属性时为null 或为null; Java 8 中的函数式风格

swift - 将选项分配给惰性属性的更优雅的方式

java - 使用主机名而不是IP地址实现java安全策略?

java - 子类化集合并使用泛型

java - Java 泛型中的上限通配符