Метод функционального интерфейса должен принимать один аргумент того же типа, что и именованный класс c
, поэтому вам нужно определить универсальный тип для этого класса, давайте назовем его C
.
Метод функционального интерфейса должен возвращать значение типа T
, но позволяет переименовать его R
для представления возвращаемого типа.
Это означает, что ваш интерфейс функции может быть: Function<C, R>
Ваше полное объявление метода будет таким:
public <C, R> R myMethod(Class<? extends C> clazz, Function<C, R> method)
Это можно назвать именно так, как вы показали.
Демо
public class Test {
public static void main(String[] args) throws Exception {
Test t = new Test();
String param1 = "Foo", param2 = "Bar";
String result = t.myMethod(SomeClass.class, x -> x.someMethod(param1, param2));
System.out.println(result);
}
public <C, R> R myMethod(Class<? extends C> clazz, Function<C, R> method) throws Exception {
C obj = clazz.getConstructor().newInstance();
return method.apply(obj);
}
}
class SomeClass {
public SomeClass() {}
public String someMethod(String param1, String param2) {
return param1 + " + " + param2 + ": " + this;
}
}
выход
Foo + Bar: test.SomeClass@5594a1b5