2012-06-27 106 views
2

這可能聽起來像重新創建輪子,但我試圖實現一個地圖(如Map<K,V>)。該類有一個叫做sortedKey()的函數,它返回一個ArrayList<K>我的代碼的精簡版本如下。我已經包括了我的嘗試,作爲評論內聯調試。通用返回類型Javac錯誤

import java.util.ArrayList; 
import java.util.Collections; 

public class Map<K,V> { 
    private ArrayList<Pair<K,V> > array; //Pair<K,V> is a class defined in another file. 

    //returns an ArrayList(of proper type) of keys (ie, the desired function) 
    public ArrayList<K> sortedKeys(){ 
     ArrayList<K> ret = keys(); //another method defined inside same class 

     K s = ""; // error: no suitable method found for sort(ArrayList<K>) 
     Collections.sort(new ArrayList<String>()); //Works just fine.. 
     Collections.sort(ret); //Same error here.. 
     return ret; 
    } 
} 

任何想法爲什麼這個錯誤顯示?根據用於創建類的類型變量,我是否可以不使用通用返回類型?還是我必須做其他事情才能達到預期的效果?

感謝和道歉,如果這個問題已經被問

接cajetan

+1

這條線真的是要說'K s =「」;'?這看起來是錯誤的,特別是在註釋中的錯誤不匹配(即提到'sort'調用)。 –

回答

3

看一看的Collections.sort簽名:

public static <T extends Comparable<? super T>> void sort(List<T> list) 

所以錯誤,儘管它可能是混亂的,是正確的 - 你不能任意類型的列表上的呼叫進行排序;元素類型必須實現Comparable。

如果限制你的泛型參數具有可比性,如:

public class Map<K extends Comparable<K>,V> { 
    ... 

然後像您期望的調用Collections.sort(ret)會成功。

沒有這個通用參數的限制,有人可以創建一個Map,其鍵值類型如Exception那樣不可比 - 然後您如何期待可憐的Collections.sort來處理? :)

+0

非常感謝,解決了我的問題:) –

+0

沒問題。在設計泛型類時,我經常會經歷類似的步驟 - 使用無界通配符,然後才意識到它對於具有某些基本屬性(如「Serializable」,「Comparable」或「Closeable」等)的類纔有意義。能夠通過類型系統以及Javadocs表達這一點很好。 –

+0

爲獲得最佳效果,請使用'K extends Comparable ' – newacct

0

嗯......你應該提供一個比較或說明您的K實現可比(無論它可能是)類。

在實現可比較的情況下,還聲明類似這樣的參數以限制它僅包含可比對象。

public class Map<K extends Comparable<K>, V> 
+0

爲獲得最佳效果,請使用'K extends Comparable ' – newacct

0

Collection.sort()的類型必須是

public static <T extends Comparable<? super T>> void sort(List<T> list) 

換言之的Javadoc,K都將被聲明爲Comparable<K>Comparable<? super K>

2

編譯器會提醒您K可能不是一種有序的類型。你應該聲明類爲

public class Map<K extends Comparable<K>, V> { 

保證K值可以相對於其他K值。

+0

非常感謝,解決了我的問題:) –

+0

爲獲得最佳效果,請使用'K extends Comparable ' – newacct

+0

理論上是正確的,但我從未見過它實際上會生成實際代碼中的差異。 –