Java:如何传递引用到new操作符?

3

我知道可以将一个方法的引用传递给另一个方法,像这样:

foo(Bar::doBar); // or e.g.
foo(bar::doBar); // or e.g.
foo(this::doBar);

有没有可能将引用传递给new运算符?

Android Studio建议我将以下行替换为:

(a, b) -> new Pair<>(a, b)

使用对新方法的方法引用。但是我该怎么做呢?


2
如果Android Studio给你提示,它也可以为你进行转换。 - Mark Rotteveel
2个回答

4

构造函数引用是方法引用表达式的一种特殊情况。术语上说,引用不是指运算符,而是指特定的构造函数。例如,如果Pair<T>有多个构造函数,则根据静态上下文将选择正确的构造函数。

引用构造函数的不同方式(来自JLS):

ArrayList<String>::new     // constructor for parameterized type
ArrayList::new             // inferred type arguments
                           // for generic class
Foo::<Integer>new          // explicit type arguments
                           // for generic constructor
Bar<String>::<Integer>new  // generic class, generic constructor
int[]::new                 // array creation

值得一提的是,ArrayList::new 从不引用原始构造函数。 - Andrew Tobilko

1
是的,使用。
Pair<>::new

这将调用构造函数。
这也是使用Optional.orElseThrow的首选方式:
list.stream().filter(...).findFirst().orElseThrow(MyException::new)

因为new是一个关键字,所以不能有一个名为new的方法,如果这个意思应该是构造函数还是方法就不会有歧义。

7
.orElseThrow(MyException::new) 这种写法并不理想——它既没有设置信息也没有设置原因...只是一种花哨的语法 :) - Andrew Tobilko
最终的实现将会调用它。 - Johannes Kuhn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接