Я создал этот класс GenericBuilder (почти не вдохновленный Как реализовать шаблон построителя в Java 8?)
public class GenericBuilder<T> {
private final T instance;
private GenericBuilder(T instance) {
this.instance = instance;
}
public static <T> GenericBuilder<T> of(Supplier<T> instantiator) {
return new GenericBuilder<T>(instantiator.get());
}
public <U> GenericBuilder<T> with(BiConsumer<T, U> consumer,
U value) {
((Consumer<T>) t -> consumer.accept(t, value)).accept(instance);
return this;
}
public <U> GenericBuilder<T> with(BiConsumer<T, U> consumer,
Supplier<U> supplier) {
return with(consumer, supplier.get());
}
public T build() {
return instance;
}
}
Но второй метод with () бросает
incompatible types: cannot infer type-variable(s) U (argument mismatch; java.lang.Long is not a functional interface)
когда я выполняю следующее:
GenericBuilder.of(Dto::new)
.with(Dto::setId, entity::getId)
.build();
Обратите внимание, что организация является экземпляром класса Организация.
Я могу просто чего-то упустить, но почему with не может быть реализован как просто consumer.accept(instance, value)? Зачем объявлять отдельную лямбду, если вы просто собираетесь ее сразу вызвать?
С какой версией Java вы компилируете?
Даниэль, ты прав, спасибо за совет, но ошибка осталась. Джейкоб, версия java "1.8.0_152".
Можете ли вы попробовать обновиться до более поздней версии Java (желательно 11) и сообщить нам, сохраняется ли ошибка? В более поздних версиях было много улучшений логических выводов.
Я полагаю, что с стиранием шрифта перегрузка with() проблематична. Вы пробовали использовать только вариант with(BiConsumer, Supplier)?




не могли бы вы предоставить образцы данных для воспроизведения указанной ошибки?