Передача значений Optional.absent() методам
Одна из проблем с использованием типа Guava Optional
в качестве аргументов методов заключается в том, что вы не можете просто написать
// method declaration
public void foo(Optional<String> arg);
// compiler error
foo(Optional.absent());
из-за ошибки вывода типа, но вместо этого нужно явно указать тип:
// real method call
foo(Optional.<String> absent());
Как я могу избежать этого?
Ответы
Ответ 1
Просто, когда я писал вопрос, я думал о том, что
public class GuavaConstants {
@SuppressWarnings( { "raw" })
public static final Optional ABSENT = Optional.absent();
// similar for empty ImmutableList, etc.
}
а затем вызов может выглядеть как
@SuppressWarnings( { "unchecked" })
foo(GuavaConstants.ABSENT);
Есть ли лучший подход?
Ответ 2
Если вы имеете дело с небольшим набором типов Optional<>
(например, в основном строк или нескольких других типов), просто создайте вспомогательные методы, которые связывают аргумент типа для вас:
public final class AbsentValues {
public static Optional<String> absentString() {
return Optional.<String>absent();
}
}
Вы можете даже импортировать эти статически, чтобы получить более чистый код:
import static AbsentValues.*;
...
foo(absentString());
Для менее распространенных типов Optional<>
просто укажите аргумент типа явно. Это может быть не очень красиво, но это правильно.
Ответ 3
Итак, это правильный способ сделать это. Если бы не что-нибудь еще, позвольте мне хотя бы показать это здесь для моей собственной будущей ссылки, для всех, кто не читает вопросы, как я:) Спасибо ColinD (и Alexey).
foo(Optional.<String>absent())