java - significa - Advertencia de compilación: llamada no comprobada a XXX como miembro del tipo raw
@suppresswarnings spring (3)
Estoy recibiendo la advertencia del compilador:
advertencia: [sin marcar] llamada sin marcar a setView (V) como miembro del tipo sin procesar AbstractPresenter
this.presenter.setView(this);
donde V es una variable de tipo:
V extiende AbstractView declarado en la clase AbstractPresenter
El código de la clase AbstractPresenter
es el siguiente:
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;
}
}
El método setView
se llama en la clase AbstractView
continuación:
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;
}
}
Busqué las preguntas de otros miembros con respecto a la misma advertencia y traté de adaptar las soluciones a mi problema, pero no funcionó.
No entiendo por qué surge la advertencia ya que el tipo V
se fuerza en la declaración de la clase AbstractPresenter
:
public abstract class AbstractPresenter<V extends AbstractView, M>
implements Presenter<V, M>
Es solo una advertencia y podría ignorarlo, pero me gustaría entender por qué sucede y quiero que mi código sea lo más limpio posible.
Quería agregar un comentario pero no podía porque no tengo suficiente reputación.
tus tipos son crudos el presentador en AbstractView es de tipo raw, ya que los parámetros genéricos pasados a Abstract View son raw
Su problema es con esta línea:
public abstract class AbstractView<P extends AbstractPresenter> extends
Su P
se declara como un tipo que extiende un AbstractPresenter
procesar . Básicamente, no sabemos qué es la V
y M
de ese tipo.
Por this.presenter
tanto, este this.presenter
es de este tipo en bruto y no sabemos su V
y M
Por lo tanto, cuando llama a su setView
con this
, el compilador no puede decir si los tipos son correctos o no.
Lo mismo es cierto para
public abstract class AbstractPresenter<V extends AbstractView, M>
V
es un tipo que amplía un AbstractView
sin AbstractView
y no sabemos cuál es el tipo base del mismo. Por lo tanto, el compilador no puede hacer el trabajo para el cual estaban destinados los genéricos.
Siempre que haga declaraciones de este tipo, recuerde especificar los tipos de todos los tipos genéricos en la declaración y utilice variables de tipo que representen correctamente las relaciones entre ellos.
Sus tipos son en bruto, es decir, sus tipos genéricos están vinculados a un tipo que sí tiene un tipo, pero no ha proporcionado uno, por lo que es en bruto.
Cambie los límites de su tipo para ser escrito. Prueba esto:
public abstract class AbstractPresenter<V extends AbstractView<V>, M> implements Presenter<V, M>
y
public abstract class AbstractView<P extends AbstractPresenter<P> extends UserControl