Domanda

(Lavoro in Java) Ho una classe astratta con generico digitando tutta la classe:

public abstract class ConnectionProcessor<T>
{
    public void process()
    {
        for (List<T> resultsPage : connection)
        {
            processPage(resultsPage);
        }
    }

    protected abstract void processPage(List<T> resultsPage);
}

Ho un'altra classe che estende disse classe astratta, con la seguente dichiarazione:

public class AlbumProcessor<Album> extends ConnectionProcessor
{
    @Override
    protected void processPage(List resultsPage)
    {
        //Do stuff here specific to Album
    }
}

Questa dichiarazione funziona bene, ma in processPage Voglio fare Albumspecifici di cose, e cerco di evitare di fusione quando non ho bisogno di usarlo.Io preferirei che questa è la dichiarazione di un metodo:

protected void processPage(List<Album> resultsPage)

Ma questo non soddisfa i requisiti per l'override processPage da ConnectionProcessor.Perché è questo?Come posso ottenere il comportamento desiderato?Penso che in AlbumProcessor Ho potuto solo plug in <Album> ovunque ConnectionProcessor ha <T>, ma che proprio non è il caso.

È stato utile?

Soluzione

Provare

//extend prameterized version of ConnectionProcessor<T> with Album as actual type argument
public class AlbumProcessor extends ConnectionProcessor<Album> {

invece di

public class AlbumProcessor<Album> extends ConnectionProcessor {

Quando si esegue il sopra di voi sono exteding la prima versione del tipo generico ConnectionProcessor<T> e l'introduzione di un nuovo parametro di tipo formale - Album (come T) che non è un vero argomento di tipo in questo caso.

Altri suggerimenti

Perché non legare il tuo super classe di tipo Generico T per Album.

Piuttosto, questo è ciò che si dovrebbe fare:

public class AlbumProcessor extends ConnectionProcessor<Album>

Così, quando avrai eseguito l'override del metodo processPage, (utilizzando un IDE), verrà generato il codice come segue:

@Override
protected void processPage(List<Album> resultsPage)
{
    //Do stuff here specific to Album
}
public class AlbumProcessor extends ConnectionProcessor<Album>

Provare:-

public class AlbumProcessor extends ConnectionProcessor<Album>
{
    @Override
    protected void processPage(List<Album> resultsPage)
    {
        //Do stuff here specific to Album
    }
}

È necessario associare il tuo super classe con il tipo che si desidera dare un parametro di tipo di Elenco nella vostra dichiarazione di metodo..

Come dici qualcosa di più simile a questo.

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";
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top