猿问

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

我看到这么一句

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

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

慕慕森
浏览 3287回答 8
8回答

吃鸡游戏

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

BIG阳

由于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(); 这样的写法是可以通过编译的。但是这样是类型不安全的,不推荐这样的写法,还是应该使用泛型,带上类型参数。

手掌心

可以,没毛病

RISEBY

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

慕莱坞森

钻石语法(属于Coin项目),这是Java7的一项改进,减少处理泛型时敲键盘的次数。7以前: Map<String, User> map = new HashMap<String, User>();7以后: Map<String, User> map = new HashMap<>(); 编译器会推断出后面的泛型。
随时随地看视频慕课网APP

相关分类

Java
我要回答