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.

¿Fue útil?

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";
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top