新的番石榴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对象也可以通过内部单例来实现。
答案 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);