Search code examples
javagenericsdependency-injectioncdi

No suitable name with generic and HAS-A relation in Java


I have the following classes:

public abstract class AbstractElement<V extends AbstractElementView, M extends AbstractElementModel> {

    @Inject
    private Instance<V> viewInstance;

    protected Instance<V> getViewInstance() {
        return viewInstance;
    }

    public abstract V newView();
}

public abstract class AbstractElementModel<E extends AbstractElement> {}

public abstract class AbstractElementView<E extends AbstractElement, M extends AbstractElementModel> {}

public class Temp<V extends TempView, M extends TempModel> extends AbstractElement<V, M>{
    @Override
    public V newView() {
        return getViewInstance().select(TempView.class).get();//LINE X
    }
}

public class TempModel<E extends Temp> extends AbstractElementModel<E> {}

public class TempView<E extends Temp, M extends TempModel> extends AbstractElementView<E, M>{}

Element consists of view and model. View knows about element and model, model knows only about element (don't ask what pattern is this - this is not important). I have AbstractElement and Temp. Temp can also be inherited. In Temp I need to override newView method. However, I get not suitable method found for select at LINE X. What is my mistake?

EDIT : Inject and Instance are

javax.enterprise.inject.Instance;
javax.inject.Inject;

Solution

  • You use a lot of raw types as type parameters. This will not go well.

    getViewInstance() in Temp gives you Instance<V> where V extends TempView.

    viewInstance.select is applicable to Class<U> subtype where U extends V (which extends TempView). V can be any subclass of TempView, so TempView can't substitute U and therefore you can't pass Class<TempView> to select.