Herança do método digitado genérico da classe abstrata - converta para um tipo específico
-
13-12-2019 - |
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.
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";
}
}