Невозможно определить функциональный интерфейс типа Java 8
У меня есть фабрика (Registry DP), которая инициализирует класс:
public class GenericFactory extends AbstractFactory {
public GenericPostProcessorFactory() {
factory.put("Test",
defaultSupplier(() -> new Test()));
factory.put("TestWithArgs",
defaultSupplier(() -> new TestWithArgs(2,4)));
}
}
interface Validation
Test implements Validation
TestWithArgs implements Validation
И в AbstractFactory
protected Supplier<Validation> defaultSupplier(Class<? extends Validation> validationClass) {
return () -> {
try {
return validationClass.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new RuntimeException("Unable to create instance of " + validationClass, e);
}
};
}
Но я продолжаю получать Не могу определить функциональный тип интерфейса Ошибка. Что я здесь делаю неправильно?
Ответы
Ответ 1
Метод defaultSupplier
имеет тип аргумента Class
. Вы не можете передать выражение лямбды, где ожидается Class
. Но вам не нужен этот метод defaultSupplier
любом случае.
Поскольку Test
и TestWithArgs
являются подтипами Validation
, лямбда-выражения () → new Test()
и () → new TestWithArgs(2,4)
уже назначаются Supplier<Validation>
без этого метода:
public class GenericFactory extends AbstractFactory {
public GenericPostProcessorFactory() {
factory.put("Test", () -> new Test());
factory.put("TestWithArgs", () -> new TestWithArgs(2,4));
}
}