suppresswarnings significa que java generics compiler-warnings unchecked

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