web-dev-qa-db-fra.com

Avertissement de compilation: appel non vérifié à XXX en tant que membre du type brut

Je reçois l'avertissement du compilateur:

avertissement: [non vérifié] appel non vérifié à setView (V) en tant que membre du type brut AbstractPresenter

   this.presenter.setView(this);

où V est une variable de type:

V étend AbstractView déclaré dans la classe AbstractPresenter

Le code de la classe AbstractPresenter est le suivant:

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

La méthode setView est appelée dans la classe AbstractView ci-dessous:

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

J'ai recherché les questions des autres membres concernant le même avertissement et j'ai essayé d'adapter les solutions à mon problème, mais cela n'a pas fonctionné.

Je ne comprends pas pourquoi l'avertissement est émis car le type V est forcé dans la déclaration de la classe AbstractPresenter:

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

C'est juste un avertissement et je pourrais l'ignorer mais je voudrais comprendre pourquoi cela se produit et je veux que mon code soit aussi propre que possible.

17
jcollin.be

Vos types sont bruts - c'est-à-dire que vos types génériques sont liés à un type qui a lui-même un type, mais vous n'en avez pas fourni un, c'est donc brut.

Modifiez les limites de votre type à saisir. Essaye ça:

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

et

public abstract class AbstractView<P extends AbstractPresenter<P> extends UserControl
9
Bohemian

Votre problème est avec cette ligne:

public abstract class AbstractView<P extends AbstractPresenter> extends

Votre P est déclaré comme un type qui étend un rawAbstractPresenter. Fondamentalement, nous ne savons pas ce que sont les V et M de ce type.

Par conséquent this.presenter est de ce type brut et nous ne connaissons pas ses V et M. Ainsi, lorsque vous appelez son setView avec this, le compilateur ne peut pas dire si les types sont corrects ou non.

Il en va de même pour

public abstract class AbstractPresenter<V extends AbstractView, M> 

V est un type qui étend un rawAbstractView et nous ne savons pas de quel type de base il s'agit. Ainsi, le compilateur ne peut pas faire le travail pour lequel les génériques étaient destinés.

Chaque fois que vous faites de telles déclarations de type, n'oubliez pas de spécifier les types de tous les types génériques dans la déclaration et utilisez des variables de type qui représentent correctement les relations entre elles.

7
RealSkeptic

J'avais voulu ajouter un commentaire mais je n'ai pas pu car je n'ai pas assez de réputation.

vos types sont bruts. le présentateur dans AbstractView est de type brut car les paramètres génériques passés à Abstract View sont bruts

2
The-null-Pointer-