2010-10-29 68 views
2

对于CS类,我需要使用三种数据结构来解决分配的问题:Queue,PriorityQueue和Stack。我想用抽象的数据结构编写一个单一的解决方案。我将使用每种所需数据类型的包装类来实现ADT。这是我到目前为止有:在泛型中使用Java中的抽象数据类型

称为方法的接口:实现该接口

public interface Method<E> { 

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

三和包装类。我称它们为QueueMethod,StackMethod和PriorityQueueMethod。不过,我在实现界面时遇到了一些麻烦。这是实现的开始,它给出了错误“类不是抽象的,并且不会覆盖抽象方法add(java.lang.Object)”。据我所知,两种添加方法的签名是相同的。

这里开始QueueMethod包装类:

public class PriorityQueueMethod<T> implements Method { 

    PriorityQueue<T> queue; 

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

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

尝试添加(Object data)为实现方法。 – rapadura 2010-10-29 09:14:49

+0

@AntonioP nope,这将是一个非通用的解决方案。你正在解决错误的问题。 – 2010-10-29 10:42:47

回答

5

添加通用于您所用的方法类,如下:

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

使用通用的签名在implements声明:

public class PriorityQueueMethod<T> implements Method<T> 

下面是的示例实现基于的解决方案:

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(); 
    } 
}