出于性能原因,我需要使用数组来存储数据。我以这样的通用方式实现了这一点(请参阅 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
的实例上面的类同时避免尽可能多的丑陋?
最佳答案
这里有两个问题。
你真的需要传入
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]; } }
如果您确实需要
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/