有什么理由我不应该忽略具体类型中的泛型类型?

时间:2010-08-12 20:28:59

标签: java generics

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()”中的类型参数真的那么糟糕吗?

4 个答案:

答案 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还提供了避免在创建集合时重写类型参数的方法。