java - 为什么我不能将 HashMap<CharSequence,CharSequence> 设置为 HashMap<String,String>

标签 java generics

虽然 String 实现了 CharSequence,但 Java 不允许这样做。做出此设计决定的原因是什么?

最佳答案

之所以禁止这样做是因为它不是类型安全的:

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 项添加到 map 中。此行将产生编译时错误:

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

See here有关通用通配符的更多详细信息。

关于java - 为什么我不能将 HashMap<CharSequence,CharSequence> 设置为 HashMap<String,String>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7112142/

相关文章:

java - Selenium 网络驱动程序。错误 'org.openqa.selenium.StaleElementReferenceException: Element is no longer valid'

java - 如何使用 Tomcat 6 限制请求执行时间

java - 为第三方类自动生成 swagger 响应

c# - 复杂验证扩展

java - 限制 Java 中的类型以用于列表

java - 如何用不同的方式实现同​​一个接口(interface)的泛型方法?

java - int 从最小到最大的所有可能值,使用 Java

c# - 如何将 IEnumerable<T> 添加到现有的 ICollection<T>

generics - 相互定义的参数中的 F# 通用单位

java - 是否可以解决 "A generic array of T is created for a varargs parameter"编译器警告?