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