gpt4 book ai didi

java - 复杂类型的通用数组

转载 作者:行者123 更新时间:2023-12-02 04:24:01 25 4
gpt4 key购买 nike

出于性能原因,我需要使用数组来存储数据。我以这样的通用方式实现了这一点(请参阅 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com