java类型安全:未参数化泛型类型对性能的影响

时间:2011-07-27 08:02:42

标签: java generics warnings parameterized

我想知道是否只有安全风险还是还有其他好处 我在参数化列表时得到了。

我收到此警告

  

List是原始类型引用泛型类型List应该是   参数

在声明例如

列表时
List myList;

如果我改为此,则没有警告

List<?> myList;

我理解为什么会有警告。 我有一个代码,有很多这些警告,我想知道是否值得花时间修复所有这些警告。 我的问题是: 如果我没有参数化列表,代码会运行得慢吗? 我的意思是它必须在运行时进行更多检查吗?

修改: 如果我改变到特定类型会影响性能吗?

List<String> myList;

5 个答案:

答案 0 :(得分:4)

  

如果我没有参数化列表,那么代码会运行得慢吗?

没有

  

我的意思是它必须在运行时进行更多检查吗?

没有

如果您对类进​​行参数化,效果将是提高代码的可读性,但只要您不使用任何反射内容,一切都只是编译时间。

答案 1 :(得分:2)

所有好处都在编译时检查中,运行代码将是相同的。话虽如此,你应该咬紧牙关并修复代码。

修改

特定类型也不会以某种方式影响性能。简而言之:泛型类型信息仅供编译器(javac)使用,它不进行任何优化(除了一些非常微不足道的,在这里不相关的东西)。优化由JVM和JIT编译器完成,它们无法访问有关泛型类型的信息 - ergo,没有性能差异。

答案 2 :(得分:1)

如果不对实例进行参数化,编译器将无法帮助您。

除非你在编译时真的不知道类型,否则不建议使用List<?>来避免编译时间检查(有时会出现这种情况,所以我不是说永远不会使用它)

答案 3 :(得分:1)

这绝对属于过早优化的范畴。编译器在将类型参数添加到生成的字节码中时对集合所做的更改只是强制转换。当你写:

List<String> values = new ArrayList<String>();
values.add("One");
values.add("Two");

String value = values.get(0); // syntactic sugar

编译器为最后一行字节码生成对应的

String value = (String) values.get(0);

因此,隐藏成本是铸造成本。正如Tom Hawtin's answer to 'Does Java casting introduce overhead?'所指出的那样:

  

这种事情在很大程度上与表现无关。

我倾向于同意 - 不要担心使用泛型时的性能损失。

答案 4 :(得分:1)

  1. 编译时检查将减少运行时出错的可能性。
  2. 使用迭代器时,会减少代码行,因为您不需要显式转换。
  3. 这是一个很好的做法。
  4. 此练习将增强代码可读性。
  5. 我觉得你应该适应更新版本(jdk 1.5中添加的泛型)