Подтвердить что ты не робот

Невозможно определить функциональный интерфейс типа 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);
            }
        };
    }

Но я продолжаю получать Не могу определить функциональный тип интерфейса Ошибка. Что я здесь делаю неправильно?

4b9b3361

Ответ 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));
    }    
}