java - 复杂类型的通用数组

标签 java arrays generics

出于性能原因,我需要使用数组来存储数据。我以这样的通用方式实现了这一点(请参阅 this answer ):

import java.lang.reflect.Array;

public class SimpleArray<T> {

    private T[] data;

    @SuppressWarnings("unchecked")
    public SimpleArray(Class<T> cls, int size) {
        this.data = (T[]) Array.newInstance(cls, size);

    }

    public T get(int i) {
        return data[i];
    }
}

问题是我需要涉及的Class<?> es.但是,我可能有一个包含泛型的更复杂的类层次结构:

public class Outer<T> {

    public class Inner {

    }

}

我想像使用普通类一样初始化数组:

SimpleArray<Integer> intArray = new SimpleArray<>(Integer.class, 10);
intArray.get(0);

SimpleArray<Outer<Integer>> outerArray;
// how to initialize this?

SimpleArray<Outer<String>.Inner> innerArray;
// how to initialize this?

我阅读了有关如何(不)获得 Class 的帖子一些通用的东西( here ),但底线似乎是一切都是类型安全相关的语法糖。

我的问题如下:如何创建 SimpleArray 的实例上面的类同时避免尽可能多的丑陋?

最佳答案

这里有两个问题。

  1. 你真的需要传入 Class ?在这种情况下,不。您的类实际上不需要在运行时知道元素类型来完成其工作。例如,您可以这样做:

    public class SimpleArray<T> {
    
        private Object[] data;
    
        public SimpleArray(int size) {
            this.data = new Object[size];
    
        }
    
        @SuppressWarnings("unchecked")
        public T get(int i) {
            return (T)data[i];
        }
    }
    
  2. 如果您确实需要 Class<T> ,你会怎样得到一个?好吧,首先你需要问自己,你要用这个做什么?永远不会有“真实”Class<T>对于不可具体化的类型 T因为有 Class<T>你可以做类似 .isInstance() 的事情检查某物是否是 T 的实例在运行时;但当然不可能在运行时检查不可具体化类型的实例。

    在这种情况下,您只需将其传递给 Array.newInstance() ,和Array.newInstance()无论如何使用原始类型(它不关心Class参数的编译时类型——参数类型是Class<?>——它只使用Class对象的运行时值),就足够了简单地强制 Class将原始类型表示为适当参数化的对象 Class类型:

    (Class<Outer<Integer>>)(Class<?>)Outer.class
    

关于java - 复杂类型的通用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32418094/

相关文章:

java - 使用 GraalVM native 镜像的 Quarkus 项目的类未实现 org.graalvm.nativeimage.hosted.Feature 错误

java - 序列化和反序列化的重要性

java - 当我按下一个键时 onKeyUp 没有启动

php - 使用动态路径访问数组

c# - 将对象转换为 Dictionary<TKey, TValue>

swift - 如何使用 Swift 泛型枚举?

c# - 为什么受 'Enum' 约束的泛型类型在 C# 7.3 中不符合 'struct' 的条件?

java - "Line not available"读取 nextLine() 时出错;从文件扫描仪

arrays - 动态维度/填充二维数组

c - 删除一行文本文件