如何在Java中制作通用ADT?

问题描述

我已经为队列ADT编写了代码,但这不是通用的。我不知道如何将我的代码转换为通用ADT。任何人都可以帮助我找出如何更改代码以使其成为通用ADT

public class DeckQueue implements DeckInterface {

    private static final int ARRAY_SIZE = 10;
    private String[] cardArray = new String[ARRAY_SIZE];
public void enqueue(String newEntry) {
        for (int i = 0; i <= cardArray.length; i++) {
            if (cardArray[i] == null) {
                cardArray[i] = newEntry;
                break;
            }
        }
        
    }
    public String dequeue() {
        // get first element from array
        String front = null;

        if (!isEmpty()) {
            front = cardArray[0];

            // shift remaining array items forward one position
            for (int i = 0; i < cardArray.length - 1; ++i) {
                cardArray[i] = cardArray[i + 1];
            }
            //set last to null
            cardArray[cardArray.length - 1] = null;
        } else {
            System.out.println("Card is empty");
        }
        return front;
    }

    public boolean isEmpty() {
        return 0 == cardArray.length;
    }

    public void clear() {
        this.cardArray = new String[ARRAY_SIZE];
    }

    @Override
    public String toString() {

        for (int i = 0; i <= cardArray.length - 1; i++) {
            System.out.println(i + "=" + cardArray[i]);
        }
        return null;
    }
}

解决方法

基本的经验法则是:

  1. 从父类和接口开始。 DeckInterface有什么方法,它假定什么类型-DeckInterface应该是通用的吗?

  2. 为该类添加类型参数。由于某些原因,经常使用单个字母,而不是更具描述性的字母。我们将使用“ E”代表“元素”:

public class DeckQueue<E> implements DeckInterface {
    ...
}
  1. 在类中,在方法和实例变量中都使用此类型参数代替特定类型。例如:
private E[] cardArray;

public void enqueue(E newEntry) {  ...  }

public E dequeue() {
    E front = null;
    ...
    return front;
}
  1. 解决剩余的问题。例如:在此类中,您需要一个泛型类型的数组。出于充分的原因,不可能直接执行此操作,请参见How to create a generic array in Java?。解决该问题的一种方法是添加一个辅助方法:
private E[] cardArray = createArray();

@SuppressWarnings("unchecked")
private E[] createArray() {
    return (E[]) new Object[ARRAY_SIZE];
}