Java中的泛型有时会很吵。编译后,编译器抛出参数化类型,所以我的问题是,忽略它们是否真的有任何缺点,只要我声明包含参数化类型的引用类型?如,
Map<String, Map<Integer, String>> myMap = new HashMap<String, Map<Integer,String>>();
太吵了。如果我写的话怎么办?
@SuppressWarnings("unchecked")
Map<String, Map<Integer, String>> myMap = new HashMap();
它更加清晰,除了Eclipse会在它下面放一条令人作呕的波浪线。把@SuppressWarning放到Eclipse会很开心,但很多人(包括我)都不喜欢在代码中使用@SuppressWarning。忽略“new HashMap()”中的类型参数真的那么糟糕吗?
答案 0 :(得分:7)
Google Collections救援!
使用Maps.newHashMap - &gt;
import com.google.common.collect.Maps;
Map<X, Map<Y, Z>> myAwesomeMap = Maps.newHashMap();
答案 1 :(得分:4)
如果你能接受警告,那真的不是问题。
Java 7 will support generic type inference对于像你的例子这样的情况,那些警告就会消失。不要压制警告,因为这可以掩盖真正的错误 - 你认为的情况被简单类型推断所涵盖,但编译器知道的更好。
答案 2 :(得分:2)
我认为有编译器警告但忽略它们会使它们变得无用。在理论上有抑制警告是好的,但它可以被滥用,所以它可能是一个坏习惯。这将在Java 7中修复,其语法为:
Map<String, Map<Integer, String>> map = new HashMap<>();
在此之前,Google系列会为您提供帮助,但由于这个原因,为了获取图书馆,这样做太简单了:
public static <K, V> HashMap<K, V> newHashMap() {
return new HashMap<K, V>();
}
答案 3 :(得分:1)
我认为在这种情况下你很好。您别无选择,只能在此行之后将myMap
称为Map<String, Map<Integer, String>>
,因此保留了类型安全性。您正确地注意到类型参数纯粹是一个编译时构造,所以您需要担心的是编译时不应该这样做。您仍然可以获得泛型的好处,所以我没有看到问题(除了丑陋的注释)。
Google Collections还提供了避免在创建集合时重写类型参数的方法。