为什么通用参数<t>在某些方法</s> </t>中更改为<s>

时间:2013-06-12 02:16:02

标签: java generics

这是我在过去考试中合作的课程:

   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>的辅助类型。从我所看到的类型没有改变,为什么有通用参数?

3 个答案:

答案 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
    ...