2010-10-29 5 views
2

Pour une classe CS, je dois résoudre un problème affecté en utilisant trois structures de données: File d'attente, PriorityQueue et Stack. Je voulais écrire une seule solution au problème en utilisant une structure de données abstraite. Je voudrais implémenter l'ADT avec une classe wrapper de chaque type de données requis. Voilà ce que j'ai jusqu'à présent:Utilisation de génériques avec des types de données abstraits en Java

Une interface appelée Méthode:

public interface Method<E> { 

    public abstract void add(E data); 
    public abstract E remove(); 
    public abstract E peek(); 
    public abstract Iterator<E> Iterator(); 
} 

Et trois classes d'emballage qui mettent en œuvre l'interface. Je les ai appelés QueueMethod, StackMethod et PriorityQueueMethod. J'ai de la difficulté à implémenter l'interface. C'est un début pour l'implémentation qui donne l'erreur "La classe n'est pas abstraite et ne remplace pas la méthode abstraite add (java.lang.Object)". Autant que je peux dire la signature des deux méthodes d'addition sont identiques.

est ici le début QueueMethod classe wrapper:

public class PriorityQueueMethod<T> implements Method { 

    PriorityQueue<T> queue; 

    public PriorityQueueMethod() { 
     queue = new PriorityQueue<T>(); 
    } 

    public void add(T data) { 
     queue.offer(data); 
    } 
} 
+0

try add (Données d'objet) pour la méthode d'implémentation. – rapadura

+0

@AntonioP non, ce serait une solution non générique. vous résolvez le mauvais problème. –

Répondre

5

Ajouter générique à la classe de la méthode que vous implémentez, comme ceci:

public class PriorityQueueMethod<T> implements Method<T> 
2

Utilisez la signature générique dans votre déclaration implements:

public class PriorityQueueMethod<T> implements Method<T> 

Voici un exemple d'implémentation pour un ArrayList solution basée:

public class ArrayListMethod<T> implements Method<T>{ 

    private final List<T> inner; 

    public ArrayListMethod(){ 
     inner = new ArrayList<T>(); 
    } 

    public ArrayListMethod(final Collection<T> data){ 
     inner = new ArrayList<T>(data); 
    } 

    @Override 
    public void add(final T data){ 
     inner.add(data); 
    } 

    @Override 
    public T remove(){ 
     return inner.remove(0); 
    } 

    @Override 
    public T peek(){ 
     return inner.get(0); 
    } 

    @Override 
    public Iterator<T> Iterator(){ 
     return inner.iterator(); 
    } 
} 
Questions connexes