Héritage d'une méthode typée générique à partir d'une classe abstraite - conversion en type spécifique
-
13-12-2019 - |
Question
(Travaillant en Java) J'ai une classe abstraite avec typage générique dans toute la classe:
public abstract class ConnectionProcessor<T>
{
public void process()
{
for (List<T> resultsPage : connection)
{
processPage(resultsPage);
}
}
protected abstract void processPage(List<T> resultsPage);
}
J'ai une autre classe qui étend ladite classe abstraite, avec la déclaration suivante :
public class AlbumProcessor<Album> extends ConnectionProcessor
{
@Override
protected void processPage(List resultsPage)
{
//Do stuff here specific to Album
}
}
Cette déclaration fonctionne bien, mais dans processPage
je veux faire Album
-des choses spécifiques, et j'essaie d'éviter de lancer lorsque je n'ai pas besoin de l'utiliser.Je PRÉFÈRErais que ce soit la déclaration de méthode :
protected void processPage(List<Album> resultsPage)
Mais cela ne répond pas aux exigences de dérogation processPage
depuis ConnectionProcessor
.Pourquoi est-ce?Comment puis-je obtenir le comportement souhaité ?Je penserais que dans AlbumProcessor
Je pourrais juste me brancher <Album>
partout ConnectionProcessor
a <T>
, mais ce n'est tout simplement pas le cas.
La solution
Essayer
//extend prameterized version of ConnectionProcessor<T> with Album as actual type argument
public class AlbumProcessor extends ConnectionProcessor<Album> {
au lieu de
public class AlbumProcessor<Album> extends ConnectionProcessor {
Lorsque vous effectuez ce qui précède, vous étendez la version brute du type générique ConnectionProcessor<T>
et introduire un nouveau paramètre de type formel - Album
(comme T
) qui n'est pas un véritable argument de type dans ce cas.
Autres conseils
C'est parce que vous n'avez pas lié votre type générique de super classe T
à Album
.
Voici plutôt ce que vous devriez faire :
public class AlbumProcessor extends ConnectionProcessor<Album>
Alors, quand vous remplacerez votre méthode processPage
, (en utilisant un IDE), il générera le code comme suit :
@Override
protected void processPage(List<Album> resultsPage)
{
//Do stuff here specific to Album
}
public class AlbumProcessor extends ConnectionProcessor<Album>
Essayer:-
public class AlbumProcessor extends ConnectionProcessor<Album>
{
@Override
protected void processPage(List<Album> resultsPage)
{
//Do stuff here specific to Album
}
}
Vous devez lier votre super classe avec le type que vous souhaitez donner comme paramètre de type à votre liste dans votre déclaration de méthode.
Que diriez-vous de quelque chose de plus comme ça.
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";
}
}