如何初始化 T 类型的对象(泛型类参数)。
public class Bolsa<T> {
private int capacidad = 10;
private int elementosActual;
private T array;
public Bolsa(int capacidad) {
this.capacidad = capacidad;
array = new T[10];//Error en tiempo de compilación.
}
}
由于类型擦除,您不能在 Java 中这样做。您有以下选择:
在构造函数中将类
T
作为参数传递并使用反射创建数组:客户端代码将调用构造函数,如下所示:
创建一个数组
Object
并在返回数组元素时执行相应的转换(用于 的实现java.util.ArrayList
):使用基于数组的设备
Object
:第一个是在开发和运行时最安全的。第二个和第三个具有处理对象数组并使用特定类型的强制转换的技巧,该类型将在运行时删除,但在开发时工作期间受支持。此外,在第二个和第三个选项中,您应该小心将阵列直接暴露给客户端,因为它们可能会破坏存储在其中的信息。
代码有两个问题:
T
您要为其分配 10 个类型对象的数组的泛型类型名称为“数组”的对象T
不是数组,因此它会生成编译错误,因为它无法将数组转换为对象...T
可以是Integer
,Cow
,或您定义的任何其他类God
,Raccoon
但这永远不知道,因为它T
实际上是任何人的通配符)。另一方面,数组确实需要知道它们的元素是什么类型。因此,施加了这种限制。因此,在运行时,您必须“强制”了解类类型,为此您可以使用
Array
名为newInstance
. 这个方法接收两个参数:一个类型的对象,Class
也是泛型的,它允许该方法在运行时知道它引用哪个类,以及两个数组的大小。一个例子,试图创建一个类型为T
10 元素的数组:其中变量
clase
的类型为Class<T>
。该表达式(T[])
用于将此方法返回的对象类型(Javadoc 指示其为 Object 类型)转换为 type 的数组,T
这是一个安全的表达式,因为该数组在运行时已经知道该类为它指的是。