Eredità di generico digitato un metodo di classe astratta — la conversione di tipo specifico
-
13-12-2019 - |
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 Album
specifici 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.
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";
}
}