Java:使用工厂实例化 T 类型的数组对象

标签 java generics reflection constructor queue

我想实例化一个 T 类型的数组:

items = new T[maxQue];

这是到目前为止我的代码,我相信一种非反射方法:

interface MyFactory<T>
{
   T[] newObject();
}

public class Queue< T extends Comparable<T> > {

   private int front;
   private int rear;
   private T[] items;
   private int maxQue;
   private static final int MAX_ITEMS = 1000;

   public Queue(MyFactory<T> factory) {
      maxQue = MAX_ITEMS + 1;
      front = maxQue - 1;
      rear = maxQue - 1;

      items = factory.newObject();
      items = new T[maxQue];
   }
}

{ items = factory.newObject();有效并解决了编译器错误,但我不知道如何使用 MyFactory 接口(interface)将数组的大小设置为 maxQue。

  • 如何声明这个大小为 maxQue 的数组?

顺便说一句,虽然我知道 Java 中反射的定义,但有人可以用外行术语来表达它和/或工厂的概念吗?

编辑:在这里找到了一个不错的反射描述: What is reflection and why is it useful?

我仍然不太清楚何时应该避免反射以及它是否适合创建数组。

最佳答案

如果 T 是类型参数,则永远不能在 Java 中使用 new T,因为它们选择实现泛型的方式。但是,有一些方法可以使用反射来解决这个问题。

由于您已经有一个 T[] 类型的对象,因此您可以使用反射来获取其类型,然后创建该类型的新数组。

items.getClass().getComponentType() 将为您提供 T 的 Class。您可以使用 items = (T[])Array.newInstance(items.getClass().getComponentType(), maxQue) 创建一个此大小的新数组。

关于Java:使用工厂实例化 T 类型的数组对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31486242/

相关文章:

java - 使用泛型创建类的基类的实例

java - 为类中的任何方法运行额外代码

java - 模拟注解方法时的 NPE

java - 在运行时覆盖 `spring.cloud.config.profile`

sql - 通用选择不适用于位类型

java - 在 sbt 中强制执行 Scala 项目的 Java 版本?

将参数传递给采用 T 的方法的 Java 错误,其中 T 扩展了 Comparable<T>

c# - GetValue(...) - 错误在运行时被忽略

java - java 是否有默认实现来恢复原始对象状态?

java - Lucene:Lucene如何存储同名字段