2013-06-12 30 views
0

這是我在過去的考試工作類:爲什麼在一些方法泛型參數<T>變化<S>

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>。我搜索了這個,發現<S>代表第一種,第二種類型<T>。從我所看到的類型沒有改變,那麼爲什麼有泛型參數?

+0

大概沒什麼特別的原因。 –

+0

typename可以被稱爲任何東西。程序員可能起牀喝咖啡,然後回來,只能稱之爲S –

+2

私人T data [] =(T [])new object [100]如何工作?除非'T'是'Object',否則你正在將一個Object []賦給一個子類數組。 –

回答

6

它改變了類型參數,因爲此方法可以在任何CyclicQueue上運行,而不是 只是CyclicQueue<T>

它也可以寫成

public void emptyList(CyclicQueue<?> queue) { 
    while(!queue.isEmpty()) { queue.pop(); } 
} 
+0

是的,你是對的..我經常看到這樣的.. –

+0

乾杯。在我發表在原始問題中的版本中,method修飾符中必需的? – Rothmanberger

+0

@ user2256772不可以使用?相反,如果你在那裏沒有任何東西,編譯器會發出警告。 – BevynQ

3

這是一個類型沒有必然的關係T。如果您有:

class CyclicQueue<T> { 
    public T foo(CyclicQueue<T> x) {...} 
    public <S> S bar(CyclicQueue<S> y) {...} 
} 

foo可以利用它自己的類型(T)的唯一循環隊列,但bar可以採取任何類型的CyclicQueue

+0

這是因爲該方法可能在CyclicQueue類之外? – Rothmanberger

+1

不,這很可能是因爲它應該在* CyclicQueue類中。它在邏輯上是相關的,可能需要訪問私有實例變量,所以它需要在同一個類中,但是'T'在該類中已經有了一個含義,所以你需要選擇一個不同的標識符。 「T」或「S」沒有什麼特別之處,它們只是常用的名稱。你可以宣佈'class CyclicQueue {...public void foo(CyclicQueue x){...}}'。 – Kevin

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 
    ... 
相關問題