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

java类型安全:未参数化泛型类型对性能的影响,java,generics,warnings,parameterized,Java,Generics,Warnings,Parameterized,我想知道是否只有安全风险或还有其他好处 我在参数化列表时得到 我收到这个警告 列表是对泛型类型列表的原始类型引用 参数化 例如,在声明列表时 List myList; 如果我改成这个,那么就没有警告了 List<?> myList; 我理解为什么会有这样的警告。 我有一个包含很多警告的代码,我想知道是否值得花时间修复所有这些警告。 我的问题是: 如果我不参数化列表,代码会运行得更慢吗? 我的意思是它在运行时需要做更多的检查吗 编辑: 如果我更改为特定类型,会影响性能吗 List&

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

我收到这个警告

列表是对泛型类型列表的原始类型引用 参数化

例如,在声明列表时

List myList;
如果我改成这个,那么就没有警告了

List<?> myList;
我理解为什么会有这样的警告。 我有一个包含很多警告的代码,我想知道是否值得花时间修复所有这些警告。 我的问题是: 如果我不参数化列表,代码会运行得更慢吗? 我的意思是它在运行时需要做更多的检查吗

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

List<String> myList;

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

编辑 特定类型也不会以某种方式影响性能。简而言之:泛型类型信息只对编译器javac可用,除了一些非常琐碎的、与此无关的事情外,它不会进行任何优化。优化是由JVM和JIT编译器完成的,它们无法访问有关泛型类型的信息——因此,没有性能差异

如果我不参数化列表,代码会运行得更慢吗

没有

我的意思是它在运行时需要做更多的检查吗

没有


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

如果您不对实例进行参数化,编译器将帮不上忙


使用列表来避免编译时检查是不可取的,除非您在编译时确实不知道类型,有时会出现这种情况,所以我不是说永远不要使用它。

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

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

String value = values.get(0); // syntactic sugar
所以隐藏成本就是铸造成本。正如他所指出的:

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

我倾向于同意这一点——不要担心在使用泛型时对性能的影响

编译时检查将减少运行时出错的可能性。 使用迭代器时,将减少代码行,因为您不需要显式强制转换。 这是一个很好的做法。 这种做法将提高代码的可读性。 另外,我觉得您应该适应JDK1.5中添加的较新版本泛型
这不会影响性能,但维护不使用原始类型的代码要容易得多。另一个好处是从列表中获取项目时不必强制转换对象。但是请注意,仅仅从原始类型更改为列表并没有帮助。类型擦除意味着运行时性能不会受到影响。如果更改为特定类型,它会影响性能吗?否-它不会影响性能,因为所有类型都会在运行时被擦除
String value = (String) values.get(0);