2015-06-13 8 views
14

Sto ottenendo l'avviso del compilatore:compilazione: chiamata non controllato a XXX come membro del tipo grezzo

avvertimento: [incontrollato] chiamata deselezionata per setview (V) come membro del tipo grezzo AbstractPresenter

this.presenter.setView(this); 

dove V è un tipo variabile:

V estende AbstractView dichiarato nella classe AbstractPresenter

Il codice della classe AbstractPresenter è il seguente:

public abstract class AbstractPresenter<V extends AbstractView, M> 
implements Presenter<V, M> { 

    private M model; 
    private V view; 

    @Override 
    public final V getView() { 
     return this.view; 
    } 

    public final void setView(V view) { 
     if (view == null) { 
      throw new NullPointerException("view cannot be null."); 
     } 

     if (this.view != null) { 
      throw new IllegalStateException("View has already been set."); 
     } 
     this.view = view; 
    } 

    @Override 
    public final M getModel() { 
     return this.model; 
    } 

    protected final void setModel(M model) { 
     if (model == null) { 
      throw new NullPointerException("model cannot be null."); 
     }   
     this.model = model; 
    } 
} 

Il metodo setView viene chiamato nella classe AbstractView di seguito:

public abstract class AbstractView<P extends AbstractPresenter> extends 
UserControl { 
    private final P presenter; 

    public AbstractView(P presenter) { 
     this.presenter = presenter; 
     this.initialisePresenter(); 
    } 

    private void initialisePresenter() { 
     if (this.presenter == null){ 
      throw new IllegalStateException(); 
     } 

     this.presenter.setView(this); //This is the call that raises the warning 
    } 

    protected P getPresenter() { 
     return this.presenter; 
    } 
} 

Ho cercato le domande degli altri membri per quanto riguarda lo stesso avvertimento e ho cercato di adattare le soluzioni al mio problema ma non ha funzionato.

Non capisco il motivo per cui l'avviso viene sollevato come il tipo V è costretto nella dichiarazione della classe AbstractPresenter:

public abstract class AbstractPresenter<V extends AbstractView, M> 
implements Presenter<V, M> 

E 'solo un avvertimento e ho potuto ignorarlo, ma vorrei capisco perché succede e voglio ottenere il mio codice il più pulito possibile.

+0

I riferimenti ciclici nel codice mi danno fastidio. Perché la vista deve avere un presentatore e perché a sua volta il relatore deve avere una vista? Non puoi convertirlo in una relazione a senso unico? – CKing

+1

http://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt-we-use-it – kervin

+0

@Chetan Kniger e Kervin Grazie a entrambi, ora so cos'è un tipo grezzo e in effetti ho dei riferimenti ciclici che si trasformeranno in eredità circolare se parametrizzo la dichiarazione di V nella classe AbstractPresenter ... Quindi ho bisogno di tornare alla parte di progettazione. Penso che la vista non abbia bisogno di fare riferimento al presentatore qui. –

risposta

9

I tipi sono non elaborati, ovvero i tipi generici sono legati a un tipo di cui è dotato un tipo, ma non ne è stato fornito uno, quindi è grezzo.

Modificare i limiti del tipo da digitare. Prova questo:

public abstract class AbstractPresenter<V extends AbstractView<V>, M> implements Presenter<V, M> 

e

public abstract class AbstractView<P extends AbstractPresenter<P> extends UserControl 
+3

Non riesco a controllare più risposte, quindi ho verificato che uno, ma tutti i contributi mi hanno aiutato a risolvere il mio problema, grazie a tutti in questa discussione. –

6

Il tuo problema è con questa linea:

public abstract class AbstractView<P extends AbstractPresenter> extends 

tuo P è dichiarato come un tipo che si estende una grezzoAbstractPresenter. Fondamentalmente, non sappiamo quali siano gli V e M di quel tipo.

Pertanto, this.presenter è di questo tipo grezzo e non conosciamo i suoi V e M. Quindi quando chiami il suo setView con this, il compilatore non può dire se i tipi sono corretti o meno.

Lo stesso vale per

public abstract class AbstractPresenter<V extends AbstractView, M> 

V è un tipo che si estende una grezzoAbstractView e non sappiamo cosa il tipo di base di esso è. Quindi il compilatore non può fare il lavoro per il quale si intendeva il generico.

Ogni volta che si effettuano dichiarazioni di questo tipo, ricordare di specificare i tipi di tutti i tipi generici nella dichiarazione e utilizzare le variabili di tipo che rappresentano correttamente le relazioni tra di esse.

2

Avrei voluto aggiungere un commento ma non potevo non avere abbastanza reputazione.

i tipi sono crudi. il presentatore in AbstractView è di tipo raw in quanto i parametri generici passati a Abstract View sono non elaborati

Problemi correlati