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

如何在Java中创建类型安全的通用数组?

夏俊人
2023-03-14
问题内容

我想在Java中创建一个通用数组,以维护通常由Java提供的类型安全。

我正在使用此代码:

class Stack<T> {

private T[] array = null;
public Stack(Class<T> tClass, int size) {
   maximumSize = size;
   // type unsafe
   //array = (T[])new Object[maximumSize];

   this.array = (T[])java.lang.reflect.Array.newInstance(tClass,maximumSize);
}

此代码类型安全吗?如果是这样,为什么?为什么它是类型安全的,我需要强制转换?


问题答案:

Array.newInstance(..)方法的返回类型为Object。因此,您不能将其直接分配给以外的任何其他对象Object。因此,您需要演员表。

该方法委托给一个native方法

创建具有指定组件类型和长度的新数组

因此,它正在创建一个type数组T

类型安全性,假设array声明

T[] array;

,由Class<T>参数和使用相同类型变量的类型转换来保证。

您应该添加

@SuppressWarnings("unchecked")

在源代码中带有解释上述原因的注释。总是评论为什么您要抑制其警告的演员阵容是安全的。



 类似资料:
  • 问题内容: 由于Java泛型的实现,因此不能有以下代码: 如何在保持类型安全的同时实现此目的? 我在Java论坛上看到了这样的解决方案: 但是我真的不知道发生了什么。 问题答案: 我不得不问一个问题:您的GenSet“已选中”还是“未选中”?那是什么意思? 检查:强打字。GenSet明确地知道什么类型的包含对象(即它的构造是明确要求有Class 参数,当他们通过了类型不是参数的方法会抛出异常E。见

  • 问题内容: 我有一个Java应用程序,可以在其中将XSD类型映射到另一个具有相同类型的类型。现在,我需要拥有一个可以映射任何类型的anyType xsd。就像我们在Java中拥有Object类型一样,是否有可能在XSD中创建类似对象。 编辑:在复杂类型级别是可能的。 问题答案: 是的,有可能。类型是。这是一个例子: (摘自底漆) 这是一个更复杂的示例: (也从底漆开始-值得一看)

  • 问题内容: 我不理解泛型和数组之间的联系。 我可以使用通用类型创建数组引用: 但是不能创建具有通用类型的数组对象: 但它有效: 问题答案: 你不应该混淆数组和泛型。他们在一起不好。数组和泛型类型执行类型检查的方式有所不同。我们说数组是经过整形的,而泛型则不是。结果,你会看到这些差异适用于数组和泛型。 数组是协变的,泛型不是: 那意味着什么?你现在必须已经知道以下分配有效: 基本上,Object[]

  • 问题内容: 如果我有泛型类,则不允许创建如下数组: (这将导致错误“无法创建Bar的通用数组”)。 但是,正如 dimo414 在回答该问题(Java如何:创建通用数组)中所建议的那样,我可以执行以下操作: (这将“仅”生成警告:“类型安全:未经检查从Object []到Bar []的转换”)。 在回应 dimo414 回答的评论中,有人声称使用此构造可能在某些情况下引起问题,而其他人则说这很好,

  • 问题内容: Scala没有enumJava所具有的类型安全的。给定一组相关的常数,Scala中代表这些常数的最佳方法是什么? 问题答案: http://www.scala-lang.org/docu/files/api/scala/Enumeration.html 使用范例