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());
答案 0 :(得分:6)
这只是方法本地泛型类型的语法。
通过直接在方法签名中声明它,U已绑定到此方法的上下文。
在类级别可以(或应该) 不知道通用参数的情况下使用该参数(例如,当您有需要通用参数的静态方法时)。
对于编译器错误,我们需要更多信息。到目前为止,我们唯一能说的是:使用给定return语句return locationAPIResponse.map() ...
的方法的签名与您的映射器返回的不匹配!
答案 1 :(得分:0)
第一个U是泛型方法的必需语法,而Optional中的第二个U是泛型类,返回类型将以该方法上下文中的泛型U作为参数。 请参考文档了解更多 https://docs.oracle.com/javase/tutorial/extra/generics/methods.html