2011-08-18 118 views
4

儘管String實現了CharSequence,但Java不允許這樣做。這個設計決定的原因是什麼?爲什麼我不能將HashMap <CharSequence,CharSequence>設置爲HashMap <String,String>

+2

http://stackoverflow.com/questions/7098402/implementations-and-collections/7098461#7098461的 –

+0

可能重複[任何簡單的方式來解釋爲什麼我不能做列表動物=新的ArrayList ()?( http://stackoverflow.com/questions/2346763/any-simple-way-to-explain-why-i-cannot-do-listanimal-animals-new-arraylistdo) –

回答

6

來禁止該決定是因爲它不是類型安全:

public class MyEvilCharSequence implements CharSequence 
{ 
    // Code here 
} 

HashMap<CharSequence, CharSequence> map = new HashMap<String, String>(); 
map.put(new MyEvilCharSequence(), new MyEvilCharSequence()); 

現在我試圖把MyEvilCharSequenceString地圖。大問題,因爲MyEvilCharSequence最肯定是而不是 a String

但是,如果你說:

HashMap<? extends CharSequence, ? extends CharSequence> map = new HashMap<String, String>(); 

那麼這樣的作品,因爲編譯器會阻止您添加非null項目到地圖。這條線會產生一個編譯時錯誤:

// Won't compile with the "? extends" map. 
map.put(new MyEvilCharSequence(), new MyEvilCharSequence()); 

See here對通用通配符的更多細節。

2

應該HashMap<? extends CharSequence, ? extends CharSequence>

相關問題