java - 泛型是否始终提供类型安全以及在哪些最佳用例下

标签 java performance generics type-inference

我在 Java 中使用过很多泛型,并且了解它们的类型删除功能和类型安全性。但是对于它们在 JAVA 中的出现存在一些批评。

我的问题是使用泛型的最佳优化方案是什么,我不是在谈论“< E > void printArray”之类的东西。是否有任何有利的使用方案或避免使用它们。 此外,在我发现它们不提供完整类型安全的情况下。

现在考虑下面的代码:

// create a vector of strings
Vector<String> strings = new Vector<String>(10);

// cast it to a vector of objects
Vector<Object> objects = (Vector<Object>)strings;

// insert an object into the vector
objects.add(new Object());
<小时/>

上面的代码会导致运行时异常吗?没有,我测试过。它实际上并没有编译。

现在查看使用数组的类似代码:

// create an array of strings
String[] strings = new String[10];

// cast it to an array of objects
Object[] objects = strings;

// insert an object into the array
objects[0] = new Object();

它能编译吗,是的,尽管事实上转换了一个字符串数组 对象数组可能会导致运行时错误。

第 8 行演示了这一点,导致运行时异常。

现在,类型删除应该在第一个示例中起作用,并让它编译,然后像在数组示例中一样引发运行时异常,因为强制转换使用数组类型 String[] 在编译时处理数组示例,类似于 vector type Vector<String>那么泛型真的在编译时对你有帮助吗?我认为这种行为是强加给开发人员的,因为参数化类型在运行时不存在,因此第一个示例的第 2 行中创建的变量只有 Vector 类型。

还有什么特别有用的是广义目标类型推断 java 8?

最佳答案

有一个有趣的 study of Python modules 。结论是 97.4% 的“变量”可以被分配为“使用单一继承的保守名义类型系统的单一静态类型”。如果我们允许类型系统(即泛型)中的参数多态性,这个数字会增加 0.5%。

这一数据点表明,在“真实程序”中使用泛型类型实际上相当罕见。在许多关于 Go 编程语言的讨论中可以找到更多轶事证据,例如this one by Brad Fitzpatrick “没有泛型。有时会很糟糕,但很少。”

泛型是一个很好的功能,它允许类型系统捕获程序的较大部分。从用户体验的角度来看,它也很好,因为它节省了打字(用手指),并且 IDE 可以提供自动完成功能(与在 Java 1.4 中手动类型转换为 Object 并返回)。但泛型并不经常出现,并且可以很容易地被代码生成所取代,因此在我看来在软件开发中几乎不是必需的。

(事实上,Go 在这里作弊。他们确实有泛型类型,但仅限于 5 个左右的内置数据结构( map 、 channel 等)。用户无法定义自己的泛型类型,也无法使用泛型在指定函数参数时输入通配符。显然,这足以满足演示文稿的作者。)

关于java - 泛型是否始终提供类型安全以及在哪些最佳用例下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39406296/

相关文章:

java - FileInputStream 在哪个文件夹中查找?

java - 如何使用 android 使用 ip camera 拍照

javascript - GWT CellTable : Selecting one checkbox selects every checkbox/row in the table

performance - Intel Core Duo 上的硬件性能计数器

java - 比较数字的通用方法

java - 重复 Stream allMatch() 直到 true

python - 迭代 Pandas DataFrame 并插入行的最快方法

c# - 如何使用反射动态创建通用 C# 对象?

java - 如何让这个嵌套通用参数系统正常工作?

python - 是否有可能在一次迭代中或比 O(n*m) 更快地找到字符串中的指定子字符串?