代码之家  ›  专栏  ›  技术社区  ›  Oleksandr Riznyk

根据条件创建特定类型的数组

  •  0
  • Oleksandr Riznyk  · 技术社区  · 5 年前

    我有个开关箱 enum 类型取决于我创建的数组。 看起来像:

    switch (type) {
        case BOOLEAN:
            Boolean[] booleans = new Boolean[];
        case STRING:
            String[] strings = new String[];
    }
    

    我想知道是否有可能提取到某种方法,使其工作如下:

    ArrayWrapper arrayWrapper = // some logic for which I am looking for
    

    然后我有一个接受任何类型数组的泛型方法,我想像 method(arrayWrapper.getArray()); 它将被铸造成特定类型并由特定类型的处理器处理?

    0 回复  |  直到 5 年前
        1
  •  2
  •   fantaghirocco    5 年前

    Java Generics 结合 Reflection API 可用于获取的实例 T[] :

    @SuppressWarnings("unchecked")
    public static <T> T[] createArrayInstance(Class<T> clazz, int size) {
        return (T[])Array.newInstance(clazz, size);
    }
    

    如果出于任何原因要在结果数组中存储值:

    @SuppressWarnings("unchecked")
    public static <T> T[] createArrayInstance(T obj) {
        T[] a = (T[])Array.newInstance(obj.getClass(), 1);//or whatever size you want
        a[0] = obj;
        return a;
    }
    

    另见: How to create a generic array in Java?

        2
  •  2
  •   Lii bob    5 年前

    这个 java.lang.reflect.Array 类提供处理任何类型数组的功能,而不知道它是什么类型。

    使用该类,可以编写如下代码:

    public void example(Class<?> elemType) {
        Object[] arr = (Object[]) Array.newInstance(elemType, 10);
    
        // Do something with the array
    }
    

    (不要投到 Object[] 如果希望能够使用基元类型的数组。)

    Array 是反射系统的一部分。这意味着你将不得不使用 Class 元素类型的对象,可能有 Object 类型以引用元素值。

        3
  •  0
  •   JimmyB    5 年前

    一种可能的方法是将数组的元素类型绑定到泛型类型参数,并在早期将处理器和数组绑定在一起:

    public class ArrayProcessingWrapper<T> {
      private final T[] array;
      private final ArrayProcessor<T> processor;
    
      public ArrayProcessingWrapper(T[] array, ArrayProcessor<T> processor) {
        super();
        this.array = array;
        this.processor = processor;
      }
    
      public void processArray() {
        this.processor.process(this.array);
      }
    
    }
    

    另一种方法可能是沿着函数的路线

    public abstract class Processor<T> {
      private final Supplier<T[]> arraySupplier;
    
      public Processor(final Supplier<T[]> arraySupplier) {
        super();
        this.arraySupplier = arraySupplier;
      }
    
      public T[] createArray() {
        return this.arraySupplier.get();
      }
    
      public void processNewArray() {
        this.doProcess(this.createArray());
      }
    
      protected abstract void doProcess(T[] data);
    }
    
    public class BooleanProcessor extends Processor<Boolean> {
      public BooleanProcessor(Supplier<Boolean[]> arraySupplier) {
        super(arraySupplier);
      }
    
      @Override
      protected void doProcess(Boolean[] data) {
        // Do fancy boolean stuff...
      }
    }
    

    但也要看看 Iterable<E> 和/或 Collection<E> (其中 ArrayList<E> 是最像数组的行为)而不是数组。

    在我看来,如果需要根据数组的(运行时)类型使用不同的逻辑(“处理器”),这似乎是一个设计缺陷。