我需要将Class<TableEditInfo<Generic Type>>
传递给一个方法来创建该泛型类型的数组,但我不确定如何使用泛型获取 TableEditInfo.class。我试过这个:
TableEditInfo<Integer> editInfo = new TableEditInfo<Integer>(someData);
c.add(editInfo.getClass(), editInfo)
但它向我展示了未经检查的演员表:'java.lang.Class<capture<? extends app.mainWindow.edit.TableEditInfo>>' to 'java.lang.Class<app.mainWindow.edit.TableEditInfo<java.lang.Integer>>'
.它有效,但我不知道这段代码是否正确,或者这样做不是一个好的做法。如果它不好,我该如何正确操作?
c 是存储TableEditInfo<T>
数组的其他类对象
添加看起来像这样:
public void add(Class<TableEditInfo<T>> type, TableEditInfo<T> editInfo){
@SuppressWarnings("unchecked")
TableEditInfo<T>[] arr = (TableEditInfo<T>[]) Array.newInstance(type,1);
arr[0] = editInfo;
stack.push(arr);
}
基本上它创建了一个单例数组,因为我只是出于某些特定原因需要它。
表达式editInfo.getClass()
的类型为Class<? extends TableEditInfo>
。? extends
是因为对象的实际运行时类可能是TableEditInfo
的子类,而缺少<T>
是因为实际上没有Class
对象表示TableEditInfo<Integer>
或TableEditInfo<String>
等 - 运行时只有一个Class
实例表示类TableEditInfo
。
无论如何,最简单的解决方案是删除type
参数,这是无用的。在运行时,传递的参数将始终相同 - 它将指向表示类TableEditInfo
的单个Class
实例,即TableEditInfo.class
。
您可以将Array.newInstance(type,1)
替换为new TableEditInfo[1]
或new TableEditInfo<?>[1]
。这两者都是合法的。(前者可以直接分配给TableEditInfo<T>[]
,并显示未经检查的转换警告。后者需要将一个演员表分配给TableEditInfo<T>[]
,这将导致未选中的演员表警告。