Herencia de un método tipificado genérico de una clase abstracta: convertir a un tipo específico
-
13-12-2019 - |
Pregunta
(Trabajando en Java) Tengo una clase abstracta con tipificación genérica durante toda la clase:
public abstract class ConnectionProcessor<T>
{
public void process()
{
for (List<T> resultsPage : connection)
{
processPage(resultsPage);
}
}
protected abstract void processPage(List<T> resultsPage);
}
Tengo otra clase que extiende dicha clase abstracta, con la siguiente declaración:
public class AlbumProcessor<Album> extends ConnectionProcessor
{
@Override
protected void processPage(List resultsPage)
{
//Do stuff here specific to Album
}
}
Esta declaración funciona bien, pero en processPage
quiero hacer Album
-Cosas específicas, y trato de evitar el casting cuando no necesito usarlo.PREFERIRÍA que esta fuera la declaración del método:
protected void processPage(List<Album> resultsPage)
Pero esto no cumple con los requisitos para anular processPage
de ConnectionProcessor
.¿Por qué es esto?¿Cómo puedo obtener el comportamiento deseado?Yo pensaría que en AlbumProcessor
Podría simplemente conectarme <Album>
en todos lados ConnectionProcessor
tiene <T>
, pero ese simplemente no es el caso.
Solución
Intentar
//extend prameterized version of ConnectionProcessor<T> with Album as actual type argument
public class AlbumProcessor extends ConnectionProcessor<Album> {
en lugar de
public class AlbumProcessor<Album> extends ConnectionProcessor {
Cuando haces lo anterior, estás extendiendo la versión sin formato del tipo genérico. ConnectionProcessor<T>
e introduciendo un nuevo parámetro de tipo formal: Album
(como T
) que no es un argumento de tipo real en ese caso.
Otros consejos
Eso es porque no vinculaste tu superclase tipo genérico T
a Album
.
Más bien, esto es lo que debes hacer:
public class AlbumProcessor extends ConnectionProcessor<Album>
Entonces, cuando anules tu método processPage
, (usando un IDE), generará el código de la siguiente manera:
@Override
protected void processPage(List<Album> resultsPage)
{
//Do stuff here specific to Album
}
public class AlbumProcessor extends ConnectionProcessor<Album>
Intentar:-
public class AlbumProcessor extends ConnectionProcessor<Album>
{
@Override
protected void processPage(List<Album> resultsPage)
{
//Do stuff here specific to Album
}
}
Debe vincular su superclase con el tipo que desea proporcionar como parámetro de tipo a su Lista en la declaración de su método.
¿Qué tal algo más como esto?
import java.util.List;
public abstract class ConnectionProcessor<T>
{
public void process()
{
System.out.println("Hello");
}
protected abstract void processPage(List<? extends T> resultsPage);
}
...
public class ProcessorImpl extends ConnectionProcessor<Album> {
protected void processPage(List<? extends Album> resultsPage) {
for(Album result : resultsPage){
System.out.println(result.getAlbumName());
}
}
}
...
public class Album {
public String getAlbumName(){
return "Sweet Smooth SOunds of the 70's";
}
}