问题描述
我已经为队列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;
}
}
解决方法
基本的经验法则是:
-
从父类和接口开始。
DeckInterface
有什么方法,它假定什么类型-DeckInterface
应该是通用的吗? -
为该类添加类型参数。由于某些原因,经常使用单个字母,而不是更具描述性的字母。我们将使用“ E”代表“元素”:
public class DeckQueue<E> implements DeckInterface {
...
}
- 在类中,在方法和实例变量中都使用此类型参数代替特定类型。例如:
private E[] cardArray;
public void enqueue(E newEntry) { ... }
public E dequeue() {
E front = null;
...
return front;
}
- 解决剩余的问题。例如:在此类中,您需要一个泛型类型的数组。出于充分的原因,不可能直接执行此操作,请参见How to create a generic array in Java?。解决该问题的一种方法是添加一个辅助方法:
private E[] cardArray = createArray();
@SuppressWarnings("unchecked")
private E[] createArray() {
return (E[]) new Object[ARRAY_SIZE];
}