在Java中使用Generics和抽象数据类型

时间:2010-10-29 09:09:24

标签: java generics abstract-data-type

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

名为 Method 的接口:

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。我在实现界面时遇到了一些麻烦。这是实现的开始,它给出了错误“Class不是抽象的,并且不会覆盖抽象方法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);
    }
}

2 个答案:

答案 0 :(得分:5)

将泛型添加到您正在实现的Method类中,如下所示:

public class PriorityQueueMethod<T> implements Method<T> 

答案 1 :(得分:2)

implements声明中使用通用签名:

public class PriorityQueueMethod<T> implements Method<T>

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

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