Подпись карты Java 8: public <U>Необязательно <U>map (Функция <? Super T, extends U> mapper) - почему нас два? - PullRequest
0 голосов
/ 06 ноября 2018
public<U> Optional<U> map(Function<? super T, ? extends U> mapper)

почему нас двое?

Я понимаю, что второй U ... Дополнительный имеет параметр, описывающий вид возвращаемого Дополнительного.

Но я не понимаю, о чем ведущий U. Я борюсь с вызовом на карте необязательный метод со следующим:

[javac]  return LocationAPIResponse.map(response -> Context.LocationContext.builder()...
[javac]                                            ^
[javac]  no instance(s) of type variable(s) U exist so that Optional<U> conforms to LocationContext
[javac]  where U,T are type-variables:
[javac]     U extends Object declared in method <U>map(Function<? super T,? extends U>)
[javac]     T extends Object declared in class Optional

Я запутался, потому что функция, которую я определяю в карте, возвращает LocationContext, созданный компоновщиком. Я смущен двумя 'U'. Почему компилятор жалуется

редактировать, конкретизировать пример кода, чтобы быть более полным:

Optional<LocationServiceResponse> locationAPIResponse = locationServiceProxy.getLocation(locationServiceRequest);
    return locationAPIResponse.map(response -> Context.LocationContext
        .builder()
       .isNearby(response.getProximity().equals(ProxyEnum.NEARBY) ? 1 : 0)
       .lat(response.getLatitude().orElse(0))
       .lng(response.getLongitude().orElse(0))
       .build());

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Первый U является обязательным синтаксисом для универсального метода, а второй U в Optional является универсальным классом и возвращаемым типом, который примет универсальный тип U в контексте этого метода в качестве параметра. Пожалуйста, обратитесь к документации для более https://docs.oracle.com/javase/tutorial/extra/generics/methods.html

0 голосов
/ 06 ноября 2018

Это просто синтаксис для локального универсального типа метода.

Объявляя это непосредственно в сигнатуре метода, U связывается с контекстом этого метода.

Вы используете это в ситуациях, когда универсальный параметр может или должен не быть известным на уровне класса (например, когда у вас есть статический метод, которому нужны универсальные параметры).

Для ошибки компилятора нам нужно больше информации. Единственное, что мы можем сказать до сих пор: сигнатура метода, использующего данный оператор return return locationAPIResponse.map() ..., не соответствует тому, что возвращает ваш маппер!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...