Pergunta

(Trabalhando em Java) Tenho uma classe abstrata com digitação genérica em toda a classe:

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

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

Tenho outra classe que estende a referida classe abstrata, com a seguinte declaração:

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

Esta declaração funciona bem, mas em processPage eu quero fazer Album-coisas específicas, e tento evitar transmitir quando não preciso usá-lo.Eu PREFERIRIA que esta fosse a declaração do método:

protected void processPage(List<Album> resultsPage)

Mas isso não atende aos requisitos para substituição processPage de ConnectionProcessor.Por que é isso?Como posso obter o comportamento desejado?eu pensaria que em AlbumProcessor Eu poderia simplesmente conectar <Album> em todos os lugares ConnectionProcessor tem <T>, mas esse não é o caso.

Foi útil?

Solução

Tentar

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

em vez de

public class AlbumProcessor<Album> extends ConnectionProcessor {

Ao fazer o acima, você está estendendo a versão bruta do tipo genérico ConnectionProcessor<T> e introduzindo um novo parâmetro de tipo formal - Album (como T) que não é um argumento de tipo real nesse caso.

Outras dicas

Isso porque você não vinculou seu tipo genérico de superclasse T para Album.

Em vez disso, é isso que você deve fazer:

public class AlbumProcessor extends ConnectionProcessor<Album>

Então, quando você substituir seu método processPage, (usando um IDE), ele irá gerar o código da seguinte forma:

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

Tentar:-

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

Você precisa vincular sua superclasse ao tipo que deseja fornecer como parâmetro de tipo à sua Lista na declaração do método.

Que tal algo mais assim?

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top