1

方法引用不适用于非静态方法 AFAIK。我尝试通过以下方式使用它们

Arrays.stream(new Integer[] {12,321,312}).map(Integer::toString).forEach(System.out::println);

这导致了链接中看到的编译错误。

错误图片

问题
在使用AssertJ库时,我使用了类似的东西,

AbstractObjectAssert<?, Feed> abstractObjectAssertFeed2 = assertThat(feedList.get(2));
abstractObjectAssertFeed2.extracting(Feed::getText).isEqualTo(new Object[] {Constants.WISH+" HappyLife"});

where Feedis a noun and getTextis a getter method and not static,但它工作正常,没有编译错误或任何让我困惑的错误。

证明不是静态方法。

我是否遗漏了有关方法引用如何工作的信息?

4

1 回答 1

2

由于不同的原因,这是无效的。

基本上有两种toString实现方式Integer

static toString(int)

/*non- static*/ toString()

这意味着您可以像这样编写流:

 Arrays.stream(new Integer[] { 12, 321, 312 })
       .map(i -> i.toString(i))
       .forEach(System.out::println);

Arrays.stream(new Integer[] { 12, 321, 312 })
       .map(i -> i.toString())
       .forEach(System.out::println);

这两个都可以通过Integer::toString. 第一个是对 a 的方法引用static method。第二个是Reference to an instance method of an arbitrary object of a particular type

由于它们都符合条件,编译器不知道该选择哪个。

于 2017-04-11T11:38:14.377 回答