2011-08-18 87 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>

相关问题