Java 8映射签名:public <u>可选<u> map(函数<!-?super T ,?扩展了U->映射器)-为什么有两个Us?

时间:2018-11-06 04:12:10

标签: java generics optional

public<U> Optional<U> map(Function<? super T, ? extends U> mapper)

为什么有两个我们?

我理解第二个U ... Optional的参数描述返回的Optional的种类

但是我不了解领先的U到底是什么。我正在努力通过以下方法调用可选的map方法:

[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

我很困惑,因为我在map中定义的函数返回一个由构建器创建的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 :(得分:6)

这只是方法本地泛型类型的语法。

通过直接在方法签名中声明它,U已绑定到此方法的上下文。

在类级别可以(或应该) 不知道通用参数的情况下使用该参数(例如,当您有需要通用参数的静态方法时)。

对于编译器错误,我们需要更多信息。到目前为止,我们唯一能说的是:使用给定return语句return locationAPIResponse.map() ...的方法的签名与您的映射器返回的不匹配!

答案 1 :(得分:0)

第一个U是泛型方法的必需语法,而Optional中的第二个U是泛型类,返回类型将以该方法上下文中的泛型U作为参数。 请参考文档了解更多 https://docs.oracle.com/javase/tutorial/extra/generics/methods.html