Я хотел бы передать ссылку на общий метод в качестве параметра в метод Java.
Просто для примера я подготовил несколько абстрактных
public abstract class AbstractFoobar{
abstract String getLiteral();
}
и 2 класса, которые его расширяют.Классы имеют конструктор параметров String.
public class Bar extends AbstractFoobar{
String literal;
public Bar(String literal) { this.literal = literal; }
public String getLiteral() { return literal; }
}
public class Foo extends AbstractFoobar{
String literal;
public Foo(String literal) { this.literal = literal; }
public String getLiteral() { return literal; }
}
У меня есть простой универсальный метод, который создает новый экземпляр объектов.Создание основано на параметре создателя функции
public <T extends AbstractFoobar> T foo(T foobar, Function<String, T> creator) {
return creator.apply("foo" + foobar.getLiteral());
}
Этот пример отлично работает, когда метод foo выполняется с определенной ссылкой на метод Bar :: new.
@Test
void test()
Bar bar = new Bar("bar");
Bar foobar = foo(bar, Bar::new);
assertEquals(Bar.class, foobar.getClass());
assertEquals("foobar", foobar.getLiteral());
}
Но я не знаю, какпередать ссылочный метод через метод-обертку fooGenerator
public <T extends AbstractFoobar> T fooGenerator(T foobar) {
//#1 return foo(foobar, T::new);
//#2 return foo(foobar, foobar.getClass().getConstructor(String.class));
}
# 1 Компилятор не может создать экземпляр типа T
# 2, метод foo (..., Function <>) не применим дляКонструктор аргумента <>