Generics 如何使用番石榴作为“可选”;“自然协变对象”;

Generics 如何使用番石榴作为“可选”;“自然协变对象”;,generics,guava,covariance,Generics,Guava,Covariance,新的番石榴有10个自然协变状态,因此可以铸造 如果我试着让它看起来有点难看: Optional<Integer> opti = Optional.of(42); Optional<Number> optn = (Optional) opti; opti=Optional.of(42); 可选optn=(可选)opti; 我喜欢看到一些实用功能,如: static <T> Optional<T> transform(Optional<?

新的番石榴有10个自然协变状态,因此可以铸造

如果我试着让它看起来有点难看:

Optional<Integer> opti = Optional.of(42);
Optional<Number>  optn =  (Optional) opti;
opti=Optional.of(42);
可选optn=(可选)opti;
我喜欢看到一些实用功能,如:

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

静态可选变换(可选,尽管施法实际上比你想象的还要难看:

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

@SuppressWarnings("unchecked") // safe covariant cast
Optional<Number> optn = (Optional) opti;
opti=Optional.of(42);
@SuppressWarnings(“未选中”)//安全协变强制转换
可选optn=(可选)opti;
…我们仍然认为这正是您应该做的,并且排除了提供您要求的方法的可能性


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

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

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

不需要丑陋类型参数:
可选。of((Number)42);
        Optional<Number> optx = Optional.<Number>of(42);