Как использовать Guava Optional как «естественно ковариантный объект» - PullRequest
4 голосов
/ 21 октября 2011

Новая Гуава 10 Необязательно заявляет, что она естественно ковариантна и, следовательно, может быть приведена.

Если я попытаюсь, это выглядит немного уродливо:

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 ]

8 голосов
/ 10 ноября 2011

Указав тип метода of, вы можете полностью исключить приведение:

        Optional<Number> optx = Optional.<Number>of(42);
8 голосов
/ 22 октября 2011

Даже если кастинг на самом деле еще страшнее , чем вы думаете:

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

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

... мы все еще думаем, что это именно то, что вам следует делать, и исключили предоставление метода, который вы запрашиваете.

Хорошо, что это немного громоздко, потому что очень редко нужно делать что-то подобное, если вы правильно используете подстановочные знаки в своих сигнатурах API, как описано в Эффективная Java .

...