Необязательный Java 8 не может быть применен к интерфейсу

Вопрос задан: 1 год назад Последняя активность: 1 год назад
up 11 down

С помощью Optional, Хочу вернуть определенную реализацию (First или же Second) интерфейса в соответствии с результатом сопоставления. Это интерфейс, который First а также Second воплощать в жизнь:

public interface MyInterface {
    Number number();
}

Последующий Optional использование ошибочно:

final String string = ...                          // might be null
final Number number = Optional.ofNullable(string)
        .map(string -> new First())
        .orElse(new Second())                      // erroneous line
        .number();

orElse (com.mycompany.First) в опционально не может применяться к (com.mycompany.Second)

Почему строка ошибочна, так как оба класса First а также Second реализовать интерфейс MyInterface и метод MyInterface::number возвращается Number? Как правильно это реализовать?

4 ответа

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Реклама

up 6 down accepted

Я обнаружил, что метод Optional::map возвращается U который не позволяет применить возврат First к другому типу такого Second является. Явное приведение к его интерфейсу или требование его в пределах map метод это путь:

final Number number = Optional.ofNullable("")
        .<MyInterface>map(string -> new First())
        .orElse(new Second())
        .number(); 

__

Изменить: я узнал об этом после публикации вопроса. Тем не менее, я сохраняю оба, так как я еще не нашел подобное решение где-либо еще.

up 5 down

Проблема в том, что Java выводит отображаемый тип на First, а также Second не является примером First. Вы должны явно дать Java немного толчка, чтобы знать правильный тип:

private static void main(String... args)
{
    final String string = "";
    final Number number = Optional.ofNullable(string)
        .<MyInterface>map(str -> new First())  // Explicit type specified 
        .orElse(new Second())
        .number();
}

Это общее ограничение вывода типа по цепочке методов. Это не ограничено Optional.

Было высказано предположение, что вывод по типу должен выполняться по цепочке методов. Смотрите этот вопрос: Вывод общего типа не работает с цепочкой метода?

Возможно, в будущей версии Java компилятор будет достаточно умен, чтобы понять это. Кто знает.

up 2 down

Я бы написал это без явного приведения:

Optional.ofNullable(string)
        .map(s -> {
             MyInterface m = new First();
             return m;  
        })
        .orElse(new Second())
        .number();
up 0 down

Хорошо, поскольку объяснение верно и в других ответах, его тип выводится при использовании map что ошибки из orElse при использовании более чистым способом представления предложенного решения будет:

Optional.ofNullable(string)
        .map(s -> (MyInterface) new First()) // casting rather than binding here
        .orElse(new Second())
        .number();

Ошибка 505

Что-то пошло не так

Попробуйте воспользоваться поиском