当用`new`实例化泛型时,包括类型参数与否之间有实际的区别吗?

张安德

我开始学习Java,并且在我的程序中

Stack<Integer> s = new Stack<Integer>();

Stack<Integer> s = new Stack<>();

Stack<Integer> s = new Stack();

全部编译并产生我期望的输出。

有实际区别吗?哪个是首选?

戴维·康拉德
Stack<Integer> s = new Stack<Integer>();

首次引入泛型时,Java 5和Java 6需要这种形式。但是自Java 7起,它变得比必需的更为冗长。

Stack<Integer> s = new Stack<>();

这种形式是在Java 7中引入的,与上面的形式等效,只是编译器会推断类型,因此程序员无需重复该形式。这是首选形式。

Stack<Integer> s = new Stack();

这使用的是原始类型,这很糟糕。允许与Java 5之前的版本向后兼容,但是编译器会抱怨将raw分配Stack给通用类型Stack<Integer>是“未经检查的转换”。

在此示例中,尚不清楚类型安全性正在丢失,因为尽管Stack创建的对象是raw Stack<Object>,但未Stack保留对原始对象的引用,并且raw保留,并且Stack不允许您传递参数来填充它,但这可能发生在其他类型,例如ArrayList

List<Integer> numbers = List.of(12, 34, 56);
List<String> names = new ArrayList(numbers); // "unchecked conversion" warning
for (String name : names) {    // ClassCastException
    System.out.println(name);
}

即使Stack我们拆分了创建和分配,问题仍然很明显:

Stack rawStack = new Stack();           // create Stack of raw types
Stack<String> typedStack = rawStack;    // "unchecked conversion" to
                                        //     strongly-typed Stack
rawStack.push(123);                     // push an Integer
typedStack.pop();                       // ClassCastException

在这种情况下,我们保留了对原始原始堆栈的引用,这使我们违反了类型安全性。您可能会说:“好吧,我永远不会这样做”,但是创建强类型开头的替代new Stack<>()方法只是两个额外的字符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当参数化类型通过层次结构传递时,在Java中创建泛型类型的实例吗?

来自分类Dev

直接在泛型类型上的类型约束与使用“ where”子句之间存在实际区别吗?

来自分类Dev

Java:泛型类型参数之间的区别

来自分类Dev

实例化泛型类型时,InvalidCastException

来自分类Dev

您可以在C#中实例化泛型类型参数的嵌套类型吗?

来自分类Dev

TypeScript中参数类型和泛型之间的区别

来自分类Java

实例化泛型的参数

来自分类Dev

实例化泛型类型

来自分类Dev

创建带有参数的泛型类型的实例作为辅助泛型类型

来自分类Dev

Java泛型-获取泛型参数的实际类型

来自分类Dev

使用泛型类型和直接将其上限类型用作函数中的参数类型之间的区别

来自分类Dev

使用泛型时,如何定义泛型类型的静态实例化器?

来自分类Dev

为什么在实例化具有具体类型的对象时不可能对变量使用泛型类型?

来自分类Dev

使用Reflection.Emit实例化具有泛型参数的泛型

来自分类Java

没有参数时如何获取泛型类型的类?

来自分类Dev

Java中参数化实例化和原始类型实例化之间的区别

来自分类Dev

有什么技巧可以在运行时知道实例泛型的实际具体类吗?

来自分类Java

Java泛型为何无法实例化泛型类型

来自分类Dev

打字稿泛型类型实例化

来自分类Dev

如何实例化泛型类型

来自分类Java

在Java中实例化泛型类型

来自分类Dev

Java实例化泛型类型

来自分类Dev

在Kotlin中实例化泛型类型

来自分类Dev

从变量实例化泛型类型

来自分类Dev

在 Scala 中创建带有或不带有泛型类型的实例有什么区别?

来自分类Java

在调用泛型/参数化方法时,是否有一种方法可以强制提供类型参数?

来自分类Dev

(泛型)之间有什么区别

来自分类Dev

泛型和实际类型之间有什么关系?(镖)

来自分类Dev

没有类型参数的泛型类型的泛型结构

Related 相关文章

  1. 1

    当参数化类型通过层次结构传递时,在Java中创建泛型类型的实例吗?

  2. 2

    直接在泛型类型上的类型约束与使用“ where”子句之间存在实际区别吗?

  3. 3

    Java:泛型类型参数之间的区别

  4. 4

    实例化泛型类型时,InvalidCastException

  5. 5

    您可以在C#中实例化泛型类型参数的嵌套类型吗?

  6. 6

    TypeScript中参数类型和泛型之间的区别

  7. 7

    实例化泛型的参数

  8. 8

    实例化泛型类型

  9. 9

    创建带有参数的泛型类型的实例作为辅助泛型类型

  10. 10

    Java泛型-获取泛型参数的实际类型

  11. 11

    使用泛型类型和直接将其上限类型用作函数中的参数类型之间的区别

  12. 12

    使用泛型时,如何定义泛型类型的静态实例化器?

  13. 13

    为什么在实例化具有具体类型的对象时不可能对变量使用泛型类型?

  14. 14

    使用Reflection.Emit实例化具有泛型参数的泛型

  15. 15

    没有参数时如何获取泛型类型的类?

  16. 16

    Java中参数化实例化和原始类型实例化之间的区别

  17. 17

    有什么技巧可以在运行时知道实例泛型的实际具体类吗?

  18. 18

    Java泛型为何无法实例化泛型类型

  19. 19

    打字稿泛型类型实例化

  20. 20

    如何实例化泛型类型

  21. 21

    在Java中实例化泛型类型

  22. 22

    Java实例化泛型类型

  23. 23

    在Kotlin中实例化泛型类型

  24. 24

    从变量实例化泛型类型

  25. 25

    在 Scala 中创建带有或不带有泛型类型的实例有什么区别?

  26. 26

    在调用泛型/参数化方法时,是否有一种方法可以强制提供类型参数?

  27. 27

    (泛型)之间有什么区别

  28. 28

    泛型和实际类型之间有什么关系?(镖)

  29. 29

    没有类型参数的泛型类型的泛型结构

热门标签

归档