【发布时间】:2021-05-07 20:42:26
【问题描述】:
我正在尝试实现一个可以将值初始化为任何类的对象的类。简单结构的初始化已经可以使用,但我在尝试初始化列表数组时遇到了困难 (List<String>[])。
有没有办法找出ParameterizedType 而不仅仅是getComponentType() 的数组的Class?
数组的创建:
if (cls.isArray()) {
Class<?> c = cls.getComponentType();
if (!c.isPrimitive()) {
Array array = new Array(c, this.sizeArrays);
for (int i = 0; i < this.sizeArrays; i++) {
array.set(i, init(c, c, this.sizeArrays, this.sizeCollection, this.recursionCount, this.values, this.ignoredClass));
}
return array.getArray();
}
类数组:
class Array<E> {
private final E[] objArray;
public final int length;
public Array(
Class<E> dataType,
int length
) {
//noinspection unchecked
this.objArray = (E[]) java.lang.reflect.Array.newInstance(dataType, length);
this.length = length;
}
void set(
int i,
E e
) {
objArray[i] = e;
}
E[] getArray() {
return objArray;
}
}
创建列表:
if (Collection.class.isAssignableFrom(cls)) {
ParameterizedType t = ((ParameterizedType) cls.getGenericSuperclass());
if (type instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) type;
Collection collection;
if (List.class.isAssignableFrom(cls)) {
collection = new ArrayList(this.sizeCollection);
} else if (Set.class.isAssignableFrom(cls)) {
collection = new HashSet(this.sizeCollection);
} else if (Queue.class.isAssignableFrom(cls)) {
collection = new LinkedList();
} else {
collection = new ArrayList(this.sizeCollection);
}
for (int i = 0; i < this.sizeCollection; i++) {
collection.add(init((Class<?>) pt.getActualTypeArguments()[0], pt.getActualTypeArguments()[0], this.sizeArrays, this.sizeCollection, this.recursionCount, this.values, this.ignoredClass));
}
return collection;
}
}
【问题讨论】:
标签: java arrays list generics reflection