当前位置: 首页 > 面试题库 >

Java泛型。通用类型的数组

穆宾白
2023-03-14
问题内容

我最近开始学习JAVA泛型。一切都说得通,我现在有点理解。但是有一件事让我烦恼-您无法创建通用类型的数组。

我想实现诸如队列和堆栈之类的抽象数据类型,但是要使用某种通用类型作为存储在堆栈中的基础数据。我将如何解决?我确定我想念但那是什么?

提前致谢。


问题答案:

《有效的Java》,第5章,GENERICS,第25项:首选列表而不是数组

数组在两个重要方面不同于通用类型。首先,数组是协变的。这个吓人的单词简单地意味着,如果Sub是Super的子类型,则数组类型Sub []是Super
[]的子类型。泛型,相反,是不变的:对于任何两个不同类型Type1Type2List<Type1>既不是一个亚型,也没有的超
List<Type2>

数组和泛型之间的第二个主要区别是数组是经过整形的[JLS,4.7]。这意味着数组在运行时知道并强制其元素类型。如上所述,如果尝试将String存储到Long数组中,则会得到ArrayStoreException。相反,泛型是通过擦除实现的[JLS,4.6]。这意味着它们仅在编译时强制执行其类型约束,并在运行时丢弃(或擦除)其元素类型信息。擦除是使泛型类型与不使用泛型的旧代码自由互操作的原因(项目23)。由于存在这些根本差异,因此数组和泛型不能很好地混合使用。例如,创建通用类型,参数化类型或类型参数的数组是非法的。这些数组创建表达式均不合法:new
List [],新列表[],新E []。所有这些都会在编译时导致通用数组创建错误。

长话短说:数组和泛型具有某种“相反的”特征,这使得在某些情况下(即使不是不可能)很难将它们混合,因此最好采用Joshua
Bloch的话,并在涉及泛型时使用List而不是数组。



 类似资料:
  • 问题内容: 因此,我正在开发这个通用的HashTable类,并且希望将其通用地用于任何数量的传入类型,并且我还想将内部存储数组初始化为LinkedList的数组(出于冲突目的),其中为确保类型安全,每个LinkedList都被预先指定为HashTable类中的泛型类型。我该怎么做?以下代码最能阐明我的意图,但当然不会编译。 问题答案: Java中的泛型不允许创建具有泛型类型的数组。您可以将数组转换

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或

  • 问题内容: 我正在刷新有关Java泛型的知识。因此,我转向了Oracle的优秀教程……并开始为我的同事编写一个演示文稿。我在本教程中遇到了有关通配符的部分,内容为: 考虑以下方法,printList: printList的目标是打印任何类型的列表,但未能实现该目标- 它仅打印Object实例的列表;它不能打印,,,等等,因为它们不是的亚型。要编写通用的printList方法,请使用: 我知道那是行

  • 我正在刷新我关于Java泛型的知识。所以我转向甲骨文的优秀教程...并开始为我的同事准备一个演示文稿。我在教程中遇到了通配符部分,上面写着: 考虑以下方法,打印列表: printList的目标是打印任何类型的列表,但它无法实现该目标-它只打印对象实例的列表;无法打印列表 我明白那个

  • 问题内容: 我有一个方法以a 作为参数。 在中,我如何知道a 是还是a 是? 问题答案: 根据用户omain的回答“如果使用<?>,则意味着您将不会在任何地方使用参数化类型。要么转到特定类型(在您的情况下,似乎是),要么转到非常通用的“ 另外,我相信如果您使用问号,编译器将在运行时(类型;有效Java的第119页)消除类型不匹配的情况,绕过擦除,并有效地消除了使用泛型类型所带来的好处? 要回答发问

  • 问题内容: 我有一个抽象类: 我需要充实的孩子-每个孩子都有自己的孩子 我只找到一种解决方案,但需要编译器参数 这是最好的解决方案吗?没有我们可以做同样的事情吗? 问题答案: 实现此目的的类型安全但很简单的方法是传递令牌“编译器可以看到它的位置”: 如果您执行的是未经检查的强制转换,但您“知道自己在做什么”,并且希望编译器停止抱怨,则正确的方法是将非类型安全但您知道它们的工作位本地化。使用: (我