2017-09-03 1 views
1

j'ai les classes suivantes:Aucun nom approprié avec générique et HAS-Une relation en Java

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>{} 

élément est constitué de vue et le modèle. La vue connaît l'élément et le modèle, le modèle ne connaît que l'élément (ne demandez pas quel est le motif - ce n'est pas important). J'ai AbstractElement et Temp. La température peut également être héritée. Dans Temp j'ai besoin de surcharger la méthode newView. Cependant, je reçois not suitable method found for select au LINE X. Quelle est mon erreur?

EDIT: Injecter et instance sont

javax.enterprise.inject.Instance; 
javax.inject.Inject; 
+0

Manque 'Instance' dans votre code. – lexicore

+0

@lexicore Désolé, impossible de trouver. Pourriez-vous fournir plus de détails? –

+0

Vous codez cette 'instance privée viewInstance;' mais vous n'avez pas inclus 'Instance' dans votre extrait de code. Que voulez-vous dire que vous ne pouvez pas trouver? ' – lexicore

Répondre

1

Vous utilisez beaucoup de types bruts comme paramètres de type. Cela ne va pas bien.

getViewInstance() dans Temp vous donne Instance<V>V extends TempView.

viewInstance.select est applicable à Class<U> subtypeU extends V (qui s'étend TempView). V peut être une sous-classe de TempView, donc TempView ne peut pas remplacer U et donc vous ne pouvez pas passer Class<TempView> à select.