Héritage d'une méthode typée générique à partir d'une classe abstraite - conversion en type spécifique

StackOverflow https://stackoverflow.com//questions/12716589

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.

Était-ce utile?

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";
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top