出于性能方面的原因我需要使用数组来存储数据。我在一个通用的方式是这样实现了这个(见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
类的实例,同时避免尽可能多的丑陋?
对我来说,它看起来像你想实现你自己的数组列表类。这是你为什么这样做的原因吗?或者为什么这个班如何实施并不适合你? – user902383
只需使用Object []'作为基础数据结构。或者首先使用'ArrayList'并放弃你自己的实现。 –
为什么需要'Array.newInstance',如果你只需传递一个准备使用的数组?你也可以使用'new SimpleArray <>(Outer.class,10)'(不管类是否为内部类),然后将结果转换为参数化类型,比如'@SuppressWarnings({“rawtypes”,“unchecked “} SimpleArray> supplierSimpleArray =(SimpleArray)new SimpleArray <>(Outer.class,10)'(你不能参数化类文字,你必须”盲“编译器去除参数化,使演员表合法化,而你可以禁止让编译器知道这个转换是安全的警告)。 –