Как вызвать параметризованный метод со ссылкой на метод
-
21-12-2019 - |
Вопрос
Рассмотрим приведенный ниже код,
interface TestInter {
public void abc();
}
class DemoStatic {
public static void testStatic(String abc) {
System.out.println(abc);
}
public void runTest () {
// Using lambda expression.
String str = "demo string" ;
TestInter demo1 = () -> DemoStatic.testStatic(str);
demo1.abc();
// Using method reference.
TestInter demo2 = DemoStatic::testStatic; // This line is not compiling.
demo2.abc();
}
}
Мы можем вызвать testStatic
метод как тело TestInter
интерфейс abc()
реализация, если параметр testStaic()
метод будет удален, как описано в это так ответ.
Но как в этом случае написать ссылку на параметризованный метод? testStatic
?
Решение
Ваш функциональный интерфейс TestInter
не имеет соответствующей подписи для вашего testStatic(String)
метод.Если вы хотите обратиться к testStatic()
используя ::
нотации, вам следует добавить параметр:
interface TestInter2 {
public void abc(String abc);
}
public void runTest () {
TestInter2 demo2 = DemoStatic::testStatic;
demo2.abc(str);
}
В соответствии с Учебное пособие по Oracle Java, существует четыре вида ссылок на методы:
Я подготовил 3 интерфейса — на 0, 1 и 2 параметра.Тогда у нас есть 3 статических и 3 метода экземпляра:
interface F0 {
void f0();
}
interface F1 {
void f1(MetRef i1);
}
interface F2 {
void f2(MetRef i1, MetRef i2);
}
public class MetRef {
public static void stat0() {;}
public static void stat1(MetRef a) {;}
public static void stat2(MetRef a, MetRef b) {;}
public void inst0() {;}
public void inst1(MetRef a) {;}
public void inst2(MetRef a, MetRef b) {;}
}
Теперь посмотрим, как каждый из методов можно использовать в качестве справочника методов в различных комбинациях, сравните их с предыдущей таблицей.Посмотрите различные типы ссылок на методы в действии и обратите внимание, откуда берутся параметры.
public class Test {
public static void main(String[] args) {
final MetRef mr = new MetRef();
final F0 mr01 = MetRef::stat0; // 1: f0() ~ MetRef.stat0()
final F0 mr02 = mr::inst0; // 2: f0() ~ mr.inst0()
final F0 mr04 = MetRef::new; // 4: f0() ~ new MetRef()
final F1 mr11 = MetRef::stat1; // 1: f1(i1) ~ MetRef.stat1(i1)
final F1 mr12 = mr::inst1; // 2: f1(i1) ~ mr.inst1(i1)
final F1 mr13 = MetRef::inst0; // 3: f1(i1) ~ i1.inst0() <== NOTICE!
final F2 mr21 = MetRef::stat2; // 1: f2(i1, i2) ~ MetRef.stat2(i1, i2)
final F2 mr22 = mr::inst2; // 2: f2(i1, i2) ~ mr.inst2(i1, i2)
final F2 mr23 = MetRef::inst1; // 3: f2(i1, i2) ~ i1.inst1(i2) <== NOTICE!
}
}