Java: new一个map时,可以不加泛型标志<x,y>吗?

我看到这么一句

private static Map<String, User> instance = Collections.synchronizedMap(new HashMap());

其中new HashMap()没有写成 new HashMap<String, User>()
这是为何?

阅读 14.7k
8 个回答

synchronizedMap()返回一个线程安全的实例, 是Collections的静态方法, 这个问题可以百度的.

JDK7的新特性,会自动推断泛型。


更新:不好意思,没有尝试,不是自动推断,这么写会有提示。。

由于java的泛型在运行时会擦除,所以本该有泛型类型参数的类或方法在初始化时可以省略,但这样虽然没有error却会有warning,所以最好加上,懒的话可以用java7以后的diamond语法new HashMap<>()

可以的,但是编译器会提示警告。

jdk 1.5 以前集合是没有泛型概念的,所以当时的类型约束纯粹自己写,然后强转。如下:

  // 忽略添加map的部分.
  Map map = new HashMap();
  for(object obj : map){
    if(obj instanceof String){
       String str = (String) obj;
       Sysout(str);
    }
  }

其实目前的java泛型还是用的这部分代码,只不过不用你写了,而是由编译器偷偷的在编译前替换一下再编译。
不相信可以写个泛型代码,编译之后在反编译,你就看得到了。

之所以这么做就是为了兼容以前不写泛型的代码,让他们也还可以正常运行。

Java1.5之后才支持泛型,所以为了兼容以前的老代码,Java泛型是通过类型擦除来实现的,所以像

new HashMap();

这样的写法是可以通过编译的。
但是这样是类型不安全的,不推荐这样的写法,还是应该使用泛型,带上类型参数。

可以,没毛病

当前可以,泛型只是为了约束key|value类型,增加可读性,
java集合key|value可以使任何非基本数据类型的对象,所以不加也没啥关系

钻石语法(属于Coin项目),这是Java7的一项改进,减少处理泛型时敲键盘的次数。
7以前: Map<String, User> map = new HashMap<String, User>();
7以后: Map<String, User> map = new HashMap<>();

编译器会推断出后面的泛型。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题