如何将getClass()与在java中具有泛型的类一起使用?



我需要将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>[],这将导致未选中的演员表警告。

最新更新