【问题标题】:How to populate generic array to main如何将通用数组填充到主数组
【发布时间】:2020-06-03 11:54:54
【问题描述】:

我有一个通用数组类,我想在 main 中返回一个数组,这样我就可以使用我在 main 中准备好的排序方法。我知道构造函数中有一个数组,所以我想知道我是否可以使用它。还是我需要设置一个新方法来返回 this.array ?它还返回一个泛型数组,我如何在 main 中选择类型?

 public class dynamicArray <T>{

private int index;
private T[] array;

public dynamicArray() {

    array = (T[])new Object[10];
    this.index = 0;

}

public T [] populate() {
    return this.array;
}

这里我为类选择了整数类型。我不确定如何提取

来自构造函数的数组。

    public static void main(String[] args) {

     dynamicArray<Integer>array = new<Integer>dynamicArray();
     array.add(10);
     array.add(5);
     array.add(6);
     array.add(11);
     array.add(13);
     array.add(20);

     int [] arr = array.populate();
     mergeSort(arr);

     System.out.println(array.toString());

}

【问题讨论】:

    标签: java arrays object generics


    【解决方案1】:

    不幸的是,数组和泛型不能很好地协同工作。看看source code of java's ArrayList——它是用Object[]而不是T[]实现的——然后每个方法都将转换为T(它的成本实际上为零,它只是丑陋并导致编译器警告)。我建议你在这里做同样的事情:Arrays 实际上知道它们的组件类型(与 Ts 列表不同,它不知道,java.util.List 上没有可以调用来获取组件类型的方法),因此转换 @987654325 @ 到 T[] 是错误的; java 仅出于向后兼容性的原因才允许这样做。

    基本上,你不能使用T[],而不会出现一些微妙的错误和很多编译器错误。

    在这种特定情况下?我强烈建议您使用 private List&lt;T&gt; array; 字段而不是 T[] 字段。

    您对array.populate() 的调用(这个方法的名称似乎很奇怪!)IS 正在检索您在构造函数中创建的数组。您正在做您要求的事情:“从构造函数中提取数组” - 在 new dynamicArray&lt;Integer&gt;() 返回的对象上调用 populate() 正是这样做的。

    注意:您的源代码中有错字。这是new dynamicArray&lt;Integer&gt;();,而不是new&lt;Integer&gt;dynamicArray();。也许这会导致一些问题?

    NB2:Java 约定规定它是DynamicArray,以及类似getBackingArray(而不是populate)。

    【讨论】:

    • "数组和 java 不能很好地协同工作。" 泛型 在 java 中不能很好地协同工作?
    【解决方案2】:

    我想你问了两个问题:

    1. 如何设置该数组对象的整数类型。
    2. 如何将 Integer[] 转换为 int[]

    代码如下:

    
    private int index;
    private T[] array;
    
    public dynamicArray() {
    
        array = (T[])new Object[10];
        this.index = 0;
    
    }
    
    public T [] populate() {
        return this.array;
    }
    
    public void add(T x) {
        array[++index] = x;
    }
    
     public static void main(String[] args) {
    
         dynamicArray<Integer>array = new<Integer>dynamicArray();
         array.add(10);
         array.add(5);
         array.add(6);
         array.add(11);
         array.add(13);
         array.add(20);
    
         int[] arr = Arrays.stream(array.populate())
                    .mapToInt(i -> i)
                    .toArray();
         System.out.println(array.toString());
    
    }
    
    

    第一个问题的答案是你不能设置整数类型,因为你的类中没有任何添加方法。第二个问题的答案是您尝试将 Integer[] 转换为 int[] 但没有直接的方法来转换它。您只需要更改 Integer -> Object 然后 Object -> int。这可以使用 Java 8 中的流轻松完成,我在这里使用 lambda 来展示 lambda 函数的强大功能。

    【讨论】:

      【解决方案3】:

      这是一个可能的替代方案。将数组的类型传递给构造函数。但本质上,您正在创建有限形式的ArrayList,因此您也可以使用它。请注意,这仍然存在不能使用原始数组作为数组类型的限制。

      dynamicArray<Integer> array = new dynamicArray<>(new Integer[0]);
      
      array.add(10);
      array.add(5);
      array.add(6);
      array.add(11);
      array.add(13);
      array.add(20);
      
      Integer[] a = array.getArray();
      
      System.out.println(Arrays.toString(a));
      
      }
      
      class dynamicArray<T> {
      
          private int size = 0;
          private T[] array;
      
          public dynamicArray(T[] a) {
              array = a;
          }
      
          public void add(T value) {
              if (array.length == size) {
                  array = Arrays.copyOf(array, size == 0 ? 10 : size*2);
              }
              array[size++] = value;
          }
      
          @SuppressWarnings("unchecked")
          public T[] getArray() {
              // need to copy the array since the length and size could be different.
              T[] arrayCopy = (T[]) Array.newInstance(array.getClass().getComponentType(), size);
              System.arraycopy(array, 0, arrayCopy, 0, size);
              return arrayCopy;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-15
        相关资源
        最近更新 更多