我看到这么一句
private static Map<String, User> instance = Collections.synchronizedMap(new HashMap());
其中new HashMap()没有写成 new HashMap<String, User>()
这是为何?
我看到这么一句
private static Map<String, User> instance = Collections.synchronizedMap(new HashMap());
其中new HashMap()没有写成 new HashMap<String, User>()
这是为何?
由于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();
这样的写法是可以通过编译的。
但是这样是类型不安全的,不推荐这样的写法,还是应该使用泛型,带上类型参数。
钻石语法(属于Coin项目),这是Java7的一项改进,减少处理泛型时敲键盘的次数。
7以前: Map<String, User> map = new HashMap<String, User>();
7以后: Map<String, User> map = new HashMap<>();
编译器会推断出后面的泛型。
4 回答1.5k 阅读✓ 已解决
4 回答1.3k 阅读✓ 已解决
1 回答2.6k 阅读✓ 已解决
3 回答1.9k 阅读
2 回答773 阅读✓ 已解决
2 回答1.7k 阅读
2 回答1.3k 阅读
synchronizedMap()返回一个线程安全的实例, 是Collections的静态方法, 这个问题可以百度的.