自己写了一个工具方法
public class Maps {
public static <K, V> HashMap<K, V> newHashMap(Entry<K, V>... entries) {
HashMap<K, V> map = new HashMap<>();
for (Entry<K, V> entry : entries) {
map.put(entry.getKey(), entry.getValue());
}
return map;
}
}
在调用这个方法的时候,idea提示泛型参数丢失
List<Map<String, String>> list = new ArrayList<>();
list.add(Maps.newHashMap());
在idea里提示:
按照这个提示,应该是指Maps.newHashMap这个方法的返回结果丢失了泛型信息,可以我明明定义了呀,于是用Map来测试:
Map<String, String> map = Maps.newHashMap();
这个时候提示
这个提示应该是说不能创建未检测的泛型数组,比如像下面的这种做法是不允许的
public static <T> T[] newT() {
return new T[2];
}
但是我看到guava里是有方法可以使用带泛型的varargs啊,像这样:
List<Integer> list = Lists.newArrayList(1, 2, 3);
于是查看了Lists.newArrayList的源码
@SafeVarargs
@GwtCompatible(serializable = true)
public static <E> ArrayList<E> newArrayList(E... elements) {
checkNotNull(elements); // for GWT
// Avoid integer overflow when a large array is passed in
int capacity = computeArrayListCapacity(elements.length);
ArrayList<E> list = new ArrayList<>(capacity);
Collections.addAll(list, elements);
return list;
}
原来是@SafeVarargs
这个注解的作用,这个是参数安全类型注解。它的目的是提醒开发者不要用参数做一些不安全的操作,它的存在会阻止编译器产生 unchecked 这样的警告。