0

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

我收到这个警告

List 是原始类型 对泛型类型 List 的引用应该被参数化

例如,当声明一个列表时

List myList;

如果我改成这个,那么就没有警告

List<?> myList;

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

编辑:如果我更改为特定类型会影响性能吗?

List<String> myList;
4

5 回答 5

4

如果我不参数化列表,代码运行速度会变慢吗?

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

如果您参数化您的类,效果将是增加代码的可读性,但只要您不使用任何反射的东西,一切都只是编译时间。

于 2011-07-27T08:06:00.500 回答
2

所有的好处都在于编译时检查,运行代码将是相同的。话虽如此,您可能应该硬着头皮修复代码。

编辑

特定类型也不会以某种方式影响性能。简而言之:泛型类型信息仅对编译器可用javac(优化由 JVM 和 JIT 编译器完成,它们无法访问有关泛型类型的信息 - 因此,没有性能差异。

于 2011-07-27T08:05:46.400 回答
1

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

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

于 2011-07-27T08:09:54.523 回答
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 对“Java 转换是否会引入开销?”的回答所指出的那样。:

这种事情在很大程度上与性能无关。

我倾向于同意 - 不要担心使用泛型时性能受到的影响。

于 2011-07-27T08:36:41.427 回答
1
  1. 编译时检查将减少运行时出错的可能性。
  2. 使用 iterator 时,将减少代码行数,因为您不需要显式强制转换。
  3. 这是一个很好的做法。
  4. 这种做法将增强代码的可读性。
  5. 我也觉得你应该适应更新的版本(jdk 1.5中添加的泛型)
于 2011-07-27T09:25:28.540 回答