这是我在过去考试中合作的课程:
class CyclicQueue<T> {
private T data[] = (T[]) new Object[100]; // max 100 items
private int items = 0, start = 0, next = 0;
public boolean isEmpty() { return items == 0; }
public void push(T item) {
if(items < data.length) {
data[next++] = item;
if(next == data.length) { next = 0; }
items++;
}
}
public T pop() {
T item = data[start++];
if(start == data.length) { start = 0; }
items--;
return item;
}
}
如您所见,使用的通用参数是<T>
然而,在随后的问题中:
Q)在下面的框中,实现一个名为emptyList的通用方法,它接受一个 通用的CyclicQueue,删除所有项目,直到它为空。
答案是:
public <S> void emptyList(CyclicQueue<S> queue) {
while(!queue.isEmpty()) { queue.pop(); }
}
我得到了相同的答案,但使用<T>
代替<S>
。我用Google搜索了这一点,发现<S>
代表第一个<T>
的辅助类型。从我所看到的类型没有改变,为什么有通用参数?
答案 0 :(得分:6)
它已更改了type参数,因为此方法可以在任何CyclicQueue
上运行,而不是。{
只需CyclicQueue<T>
。
它也可以写成
public void emptyList(CyclicQueue<?> queue) {
while(!queue.isEmpty()) { queue.pop(); }
}
答案 1 :(得分:3)
这种类型不一定与T
相关。如果你有:
class CyclicQueue<T> {
public T foo(CyclicQueue<T> x) {...}
public <S> S bar(CyclicQueue<S> y) {...}
}
foo
只能采用自己类型的循环队列(T
),但bar
可以采用任何类型的CyclicQueue
。
答案 2 :(得分:0)
emptyList有自己的参数类型,它实际上可以使用相同的参数类型名称T
public <T> void emptyList(CyclicQueue<T> queue) {
while(!queue.isEmpty()) { queue.pop(); }
}
但编译器会发出警告The type parameter T hides parameter T
,因为它无法在此方法中使用类参数类型,例如
public <T> void emptyList(CyclicQueue<T> queue) {
T e = data[0]; <-- ambiguous
...