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

发布于 2024-12-11 08:04:25 字数 887 浏览 2 评论 0 原文

新的 Guava 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);

为了转换< code>Collection> 转换为 Collection> 而不为每个对象创建新对象?

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

The new Guava 10 Optional states to be naturally covariant and thus may be casted.

If I try so it looks a bit ugly:

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

I like to see some utility function like:

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

(how to express this as a member function of Optional ?)

Is it even possible to define a transformation function object like:

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

in order to transform a Collection<Optional<Double>> into a Collection<Optional<Number>> without creating new objects for each?

I think even the returned Function object may be realized by an internal singleton.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

天气好吗我好吗 2024-12-18 08:04:25

尽管强制转换实际上比您想象的更丑

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

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

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

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

Even though casting is actually even uglier than you think:

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

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

... we still think it is exactly what you should do, and have ruled out providing a method like you ask for.

It's okay that it's a little cumbersome because you should very rarely need to do a thing like this, so long as you are using wildcards correctly in your API signatures, as covered in Effective Java.

温柔一刀 2024-12-18 08:04:25

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

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

By specifying the type of the of method, you can avoid the cast entirely:

        Optional<Number> optx = Optional.<Number>of(42);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文