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;
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
.