扫码关注官方订阅号
我看到这么一句
private static Map<String, User> instance = Collections.synchronizedMap(new HashMap());
其中new HashMap()没有写成 new HashMap<String, User>()这是为何?
认证0级讲师
synchronizedMap()返回一个线程安全的实例, 是Collections的静态方法, 这个问题可以百度的.
JDK7的新特性,会自动推断泛型。
更新:不好意思,没有尝试,不是自动推断,这么写会有提示。。
由于java的泛型在运行时会擦除,所以本该有泛型类型参数的类或方法在初始化时可以省略,但这样虽然没有error却会有warning,所以最好加上,懒的话可以用java7以后的diamond语法new HashMap<>()
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<>();
Map<String, User> map = new HashMap<String, User>();
Map<String, User> map = new HashMap<>();
编译器会推断出后面的泛型。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
synchronizedMap()返回一个线程安全的实例, 是Collections的静态方法, 这个问题可以百度的.
JDK7的新特性,会自动推断泛型。
更新:不好意思,没有尝试,不是自动推断,这么写会有提示。。
由于java的泛型在运行时会擦除,所以本该有泛型类型参数的类或方法在初始化时可以省略,但这样虽然没有error却会有warning,所以最好加上,懒的话可以用java7以后的diamond语法
new HashMap<>()可以的,但是编译器会提示警告。
jdk 1.5 以前集合是没有泛型概念的,所以当时的类型约束纯粹自己写,然后强转。如下:
其实目前的java泛型还是用的这部分代码,只不过不用你写了,而是由编译器偷偷的在编译前替换一下再编译。
不相信可以写个泛型代码,编译之后在反编译,你就看得到了。
之所以这么做就是为了兼容以前不写泛型的代码,让他们也还可以正常运行。
Java1.5之后才支持泛型,所以为了兼容以前的老代码,Java泛型是通过类型擦除来实现的,所以像
这样的写法是可以通过编译的。
但是这样是类型不安全的,不推荐这样的写法,还是应该使用泛型,带上类型参数。
可以,没毛病
当前可以,泛型只是为了约束key|value类型,增加可读性,
java集合key|value可以使任何非基本数据类型的对象,所以不加也没啥关系
钻石语法(属于Coin项目),这是Java7的一项改进,减少处理泛型时敲键盘的次数。
7以前:
Map<String, User> map = new HashMap<String, User>();7以后:
Map<String, User> map = new HashMap<>();