小编pip*_*970的帖子

与lambda和Functional Interface一起使用时理解下限的问题

在研究Java8 Streams时,我遇到了以下代码片段:

Predicate<? super String> predicate = s -> s.startsWith("g");
Run Code Online (Sandbox Code Playgroud)

由于泛型参数是下限,我认为这不会编译.我看到它的方式,如果一个Object是String的超类型,那么传入一个Object类型应该会破坏它,因为Object没有startsWith()函数.但是,我很惊讶地看到它没有任何问题.

更进一步,当我调整谓词采取上限:

<? extends String>,
Run Code Online (Sandbox Code Playgroud)

它不会编译.

我以为我理解了上限和下限的含义,但显然,我错过了一些东西.任何人都可以帮助解释为什么下限与这个lambda一起工作?

java generics lambda predicate java-8

15
推荐指数
2
解决办法
850
查看次数

Mockito Matchers:匹配参数列表中的Class类型

我正在使用Java,Spring的RestTemplate和Mockito,使用Eclipse.我试图模拟Spring的rest模板,我模拟的方法的最后一个参数是Class类型.以下是该功能的签名:

public <T> ResponseEntity<T> exchange(URI url,
                                  HttpMethod method,
                                  HttpEntity<?> requestEntity,
                                  Class<T> responseType)
                       throws RestClientException
Run Code Online (Sandbox Code Playgroud)

我嘲笑这个方法的初步尝试如下:

//given restTemplate returns exception
when(restTemplate.exchange(isA(URI.class), eq(HttpMethod.POST), isA(HttpEntity.class), eq(Long.class))).thenThrow(new RestClientException(EXCEPTION_MESSAGE));
Run Code Online (Sandbox Code Playgroud)

但是,这行代码会从eclipse中产生以下错误:

The method exchange(URI, HttpMethod, HttpEntity<?>, Class<T>) in the type RestTemplate is not applicable for the arguments (URI, HttpMethod, HttpEntity, Class<Long>)
Run Code Online (Sandbox Code Playgroud)

Eclipse然后建议我使用'Class'强制转换投射最后一个参数,但是如果我将它转换为'Class'或其他类型,它似乎不起作用.

我一直在网上寻求帮助,但似乎对请求的参数是类类型的事实感到困惑.

到目前为止我看过的答案主要与通用集合有关.这里的任何帮助将不胜感激.

java generics matcher mockito

8
推荐指数
2
解决办法
1万
查看次数

标签 统计

generics ×2

java ×2

java-8 ×1

lambda ×1

matcher ×1

mockito ×1

predicate ×1