带数组的泛型类

时间:2011-01-19 08:01:48

标签: java type-conversion generics

我想为我的Java项目创建一个自定义泛型类,这就是我得到了多少 - 我发现代码作为如何创建泛型数组的示例。

public class RegisterSet<T> {
   private T[] register;
   public <T> RegisterSet(int size) {
      register = (T[])Array.newInstance(T, size);
   }
}

现在,我收到错误Incompatible types - found: T[], required: T[],这对我来说完全没有意义 - 我该如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

这很有道理,因为你有两个不同的类型参数叫做T.然而,修复它是相当困难的,因为我看不出你希望你的代码完全编译。考虑一下这个位:

Array.newInstance(T, size);

T是类型参数的名称...您不能将其用作方法的参数。

请注意,由于类型擦除,如果您希望能够创建正确类型的数组,则需要指定相关的Class实例。例如:

public class RegisterSet<T> {
   private T[] register;
   public RegisterSet(Class<T> clazz, int size) {
      register = (T[])Array.newInstance(clazz, size);
   }
}

...但我不确定你在这里尝试使用哪个Array课程。

答案 1 :(得分:1)

您需要一个包含T的Class对象的变量。填充此对象的最简单方法可能是静态工厂方法:

public class RegisterSet<T> {
   public static <T>RegisterSet<T> create(Class<T> clazz, int size) {
       return new RegisterSet<T>(clazz, size);
   }

   private T[] register;

   @SuppressWarnings("unchecked")
   private RegisterSet(Class<T> clazz, int size) {
      if (clazz.isPrimitive()) throw new IllegalArgumentException("Cannot create a RegisterSet of primitives"); 
      register = (T[])Array.newInstance(clazz, size);
   }
}

静态方法允许你说

RegisterSet<String> x = RegisterSet.create(String.class, 42);

略短且重复性更小
RegisterSet<String> x = new RegisterSet<String>(String.class, 42);

答案 2 :(得分:0)

有两个错误:

首先:类定义了一个类型T,第二个方法定义了它自己的类型T,但是两个T都没有相互关系。 - 所以你必须从方法声明中删除额外的Type T:

public RegisterSet(int size) {

而不是:

 public <T> RegisterSet(int size) {

第二:方法Array.newInstance需要一个Class实例作为其第一个参数,但类型T不是类的实例。 - 您需要的是将类型为Class的新参数引入构造函数参数列表,并使用此参数进行数组创建。

至少所有人都应该看起来像:

  import java.lang.reflect.Array;

  public class RegisterSet<T> {
    private T[] register;

    public RegisterSet(int size, Class<T> clazz) {
       @SuppressWarnings("unchecked")
       T[] register = (T[]) Array.newInstance(clazz, size);
    }
  }

  ...
  new RegisterSet<Integer>(5, Integer.class)