2013-12-15 42 views
1

我已經定義了以下類:通配符參數

public class priorityQueue<T extends Comparable<T>> implements Iterable<T> 

它包含下列方法:

  • 公共布爾推送(T節點)
  • 公共ŤPOP()
  • public Iterator iterator()

I需要編寫從集合複製的元素一個PriorityQueue

public static<T> void copy(Collection<T> source, priorityQueue<? extends Comparable<T>> dest) { 
    for(T elem:source){ 
     dest.Push(elem); 
    } 

} 

我得到了錯誤的方法:

The method Push(capture#1-of ? extends Comparable<T>) in the type priorityQueue<capture#1-of ? extends Comparable<T>> is not applicable for the arguments (T) 

爲什麼我不能寫的方法:

public static<T> void copy(Collection<T> source, priorityQueue<T extends Comparable<T>> dest) 

我得到錯誤:

Syntax error on token "extends",, expected 

我如何聲明覆制元素的方法?

+0

通過Java類名稱約定開始大寫(這樣的PriorityQueue將是首選)和方法名以較低的情況下,這樣的方法推送應推動。 –

+0

我不使用Java.util中的方法,也不想重寫它們,我用自己的方法定義了自己的priorityQueue。 – user3042601

+0

如果您有不同的包位置,則不會使用相同的名稱覆蓋PriorityQueue。此外,更喜歡使用與標準庫中的名稱不同的名稱,例如MyPriorityQueue。任何人在未來閱讀包括你在內的代碼都會對此感到滿意。 –

回答

2

因爲T在這一點上已經定義,試試這個,而不是

public static<T extends Comparable<T>> 
void copy(Collection<T> source, priorityQueue<T> dest) {} 
+0

直到現在,這是唯一正確的答案。 –

0

您嘗試使用一個未定義類型的通配符的靜態方法。作爲靜態的,類的通配符定義無效,您需要在方法中指定它們。

添加其他的通配符,所以方法結束這樣的:

​​
+0

你試過了嗎?它不會編譯。 –

+0

是的,我確實嘗試過,是的,它會編譯。我最近多次使用過它。我注意到的是,這對於OP的要求來說太過分了,@Elliot Frisch的答案要簡單得多(並且包括我曾經忘記的「擴展Comparable 」)。 –

+0

我沒有看到你的方法如何編譯。 'P'的'push'方法需要一個'Comparable ',而你只是推送'Collection '中的元素,其中'T'沒有任何界限。 –