为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕慕森 2019-02-19 12:48:32
我看到这么一句 private static Map<String, User> instance = Collections.synchronizedMap(new HashMap()); 其中new HashMap()没有写成 new HashMap<String, User>()这是为何?
查看完整描述

8 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

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


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

查看完整回答
反对 回复 2019-03-01
?
BIG阳

TA贡献1859条经验 获得超6个赞

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

查看完整回答
反对 回复 2019-03-01
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

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

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

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

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

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

查看完整回答
反对 回复 2019-03-01
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

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

new HashMap();

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

查看完整回答
反对 回复 2019-03-01
?
手掌心

TA贡献1942条经验 获得超3个赞

可以,没毛病

查看完整回答
反对 回复 2019-03-01
?
RISEBY

TA贡献1856条经验 获得超5个赞

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

查看完整回答
反对 回复 2019-03-01
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

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

编译器会推断出后面的泛型。
查看完整回答
反对 回复 2019-03-01
  • 8 回答
  • 0 关注
  • 3269 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信