Подтвердить что ты не робот

Передача значений Optional.absent() методам

Одна из проблем с использованием типа Guava Optional в качестве аргументов методов заключается в том, что вы не можете просто написать

// method declaration
public void foo(Optional<String> arg);

// compiler error
foo(Optional.absent());

из-за ошибки вывода типа, но вместо этого нужно явно указать тип:

// real method call
foo(Optional.<String> absent());

Как я могу избежать этого?

4b9b3361

Ответ 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())