3 回答
TA贡献1854条经验 获得超8个赞
好吧,既然你知道那个类,你可以(有警告)投射它List本身;但是您仍然需要知道类名并进行一些检查,例如:
if(clazz.getName().equals("java.lang.String")) {
// warning here
yourList = (List<String>) yourList;
}
TA贡献1784条经验 获得超2个赞
不,你不能。Java 中的泛型只是一种编译时类型检查机制。如果直到运行时才知道类型,那么显然它不能用于编译时类型检查。编译器无法在编译时确定允许您放入或取出 a 的类型List<clazz>
,因此它仅比原始类型更有意义List
。
TA贡献1811条经验 获得超5个赞
有一个小技巧可用于处理特定的未知类型:声明一个仅用于未知类型的类型参数:
public <T> void worksWithSomeUnknownClass() throws ReflectiveOperationException {
@SuppressWarnings("unchecked")
Class<T> clazz = (Class<T>) Class.forName("MyClass");
T obj = clazz.getConstructor().newInstance();
List<T> myList = new ArrayList<>();
myList.add(obj);
}
但是,此解决方案非常有限。它可以确保您不会与其他未知类型或混合起来Object,但你真的不能做任何事情T。并且您必须在使用它的每个方法上声明一个类型参数。
添加回答
举报