为什么我不能将HashMap <charsequence,charsequence>设置为HashMap <string,string> </string,string> </charsequence,charsequence>

时间:2011-08-18 18:19:24

标签: java generics

尽管String实现了CharSequence,但Java不允许这样做。这个设计决定的原因是什么?

2 个答案:

答案 0 :(得分:6)

决定不允许这样做是因为它不是类型安全的:

public class MyEvilCharSequence implements CharSequence
{
    // Code here
}

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

现在我尝试将MyEvilCharSequence放入String地图中。很大的问题,因为MyEvilCharSequence绝对是而不是一个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了解有关通用通配符的更多详细信息。

答案 1 :(得分:2)

应为HashMap<? extends CharSequence, ? extends CharSequence>