如何使用Guava Optional作为“自然协变对象”

时间:2011-10-21 11:33:12

标签: generics guava covariance

新的番石榴10 Optional 表示自然协变,因此可以进行铸造。

如果我这样做,那看起来有点难看:

Optional<Integer> opti = Optional.of(42);
Optional<Number>  optn =  (Optional) opti;

我希望看到一些实用功能,如:

static <T> Optional<T> transform(Optional<? extends T> opt, Class<T> clazz);

(如何将其表示为Optional的成员函数?)

甚至可以定义转换函数对象,如:

static <T> Function<Optional<? extends T>, Optional<T>> 
transformer(Class<T> class);

为了将Collection<Optional<Double>>转换为Collection<Optional<Number>>而不为每个人创建新对象?

我认为即使返回的Function对象也可以通过内部单例来实现。

2 个答案:

答案 0 :(得分:8)

即使施放实际上甚至比你想象的还要丑陋

Optional<Integer> opti = Optional.of(42);

@SuppressWarnings("unchecked") // safe covariant cast
Optional<Number> optn = (Optional) opti;

......我们仍然认为这正是你应该做的,并且已经排除了提供你所要求的方法。

没关系,这有点麻烦,因为你很少需要做这样的事情,只要你在API签名中正确使用通配符,如所述爪哇。

答案 1 :(得分:8)

通过指定of方法的类型,您可以完全避免强制转换:

        Optional<Number> optx = Optional.<Number>of(42);