2011-10-21 48 views
4

新的番石榴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); 

(?如何表達這種可選的成員函數)

甚至可以定義一個轉換函數對象:

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

爲了將Collection<Optional<Double>>轉換爲Collection<Optional<Number>>而不爲每個創建新的對象?

我想即使是返回的函數對象可能是由一個內部單例實現。

回答

8

即使鑄造實際上是甚至醜陋比你想象的:

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

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

...我們仍然認爲這是你應該做的事情,並且已經排除了像你這樣的要求提供了一個方法。

沒關係,這是一個小麻煩,因爲你應該很少需要做這樣的事,只要你在你的API簽名正確使用通配符,如覆蓋有效的Java。

8

通過指定of方法的類型,就能避免鑄造完全:

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

無需醜陋類型參數:'Optional.of((數目)42);' –