1

I have a generic class, which has a function that returns an instance of a functional interface:

/**
 * @param <FF> - FF is a functional interface
 */
public abstract class MyFunctionalInterfaceGetter<FF> {
    public abstract <PC, AC> FF getMyFunction(Class<PC> pojoClass, Class<AC> attributeClass);
}

And I have a couple of derived classes:

public class MyGetterGetter extends MyFunctionalInterfaceGetter<java.util.function.Function> {
    public <PC, AC> Function<PC, AC> getMyFunction(Class<PC> pojoClass, Class<AC> attributeClass) {
         ...
    }
}
public class MySetterGetter extends MyFunctionalInterfaceGetter<java.util.function.BiConsumer> {
    public <PC, AC> BiConsumer<PC, AC> getMyFunction(Class<PC> pojoClass, Class<AC> attributeClass) {
         ...
    }
}

And the question:
I do not thing so, but I wanted to know if there is any way to constrain the returning parametrized type from the function parameters at the parent class.
Something like this:

public abstract class MyFunctionalInterfaceGetter<FF> {
    public abstract <PC, AC> FF<PC, AC> getMyFunction(Class<PC> pojoClass, Class<AC> attributeClass);
}

I am using Java-8

1 Answers1

0

Move the generics to the class level and apply if to its subtypes:

public abstract static class MyFunctionalInterfaceGetter<FF, PC, AC> {
    public abstract FF getMyFunction(Class<PC> pojoClass, Class<AC> attributeClass);
}
public static class MyGetterGetter<PC, AC> extends MyFunctionalInterfaceGetter<Function<PC, AC>, PC, AC> {

    @Override
    public Function<PC, AC> getMyFunction(Class<PC> pojoClass, Class<AC> attributeClass) {
        ...
    }
}
public static class MySetterGetter<PC, AC> extends MyFunctionalInterfaceGetter<BiConsumer<PC, AC>, PC, AC> {

    @Override
    public BiConsumer<PC, AC> getMyFunction(Class<PC> pojoClass, Class<AC> attributeClass) {
        ...
    }
}
Nikolas Charalambidis
  • 40,893
  • 16
  • 117
  • 183
  • Thank you, Nikolas, for your answer. The thing is that I want the parameters of FF are dynamic, and to depend on every invocation to "getMyFunction". This approach makes that you can work with only one object of "MyFunctionalInterfaceGetter" – Francisco Javier Rojas Oct 22 '22 at 09:59