作为我的问题的前言,请注意我知道擦除类型是什么。我觉得有必要说明这个有用的答案,不要埋在基本的解释中。
我想获取类 List 的类对象。对于非泛型类型,我会使用像 String.class 这样的类文字,但对于 List,即使我可以获得正确的行为,我仍然会收到警告说我做错了。
据我了解, List 的类对象将是 type Class<List>
,但即使写下该类型,
Class<List> c = null;
给出警告:“参数化类 'List' 的原始使用”。由于类型擦除,类对象无法了解列表元素,所以我的下一个猜测是
Class<List<?>> c = null;
作为一种类型被接受。接下来我必须获取类对象,但是尝试写下类文字的每一种方式都失败了:
Class<List<?>> l = List.class;
给出一个硬类型错误,而
Class<List<?>> l = List<?>.class;
说“无法从参数化类型中选择”。
Class<List<?>> l = (Class<List>)List.class;
失败并出现与没有强制转换相同的硬类型错误(预期因为强制转换是多余的),并且
Class<List<?>> l = (Class<List<?>>)List.class;
说“不可转换的类型”。
接下来,我尝试了以下无效代码片段以从编译器错误中了解一些信息:
List<?> l = new ArrayList<>();
int x = l.getClass();
现在编译器给出了一个类型错误Class<? extends java.util.List>
——暂时忽略“扩展”部分,这很明显,因为getClass()
可以返回一个子类,这告诉我.getClass()
只想谈论原始 List 类型,而不是List<?>
或类似的。在某种程度上,这对我来说似乎是正确的,因为类对象代表任何 List 实例,而不是“类型未知的列表”。但是,我现在又回到了原点,因为仅仅写下原始类型就会发出警告,所以我显然不应该这样做(我知道原始类型可用于处理遗留代码,但我在这里不这样做)。
我知道我可以像这样丢弃有关类对象的所有静态类型信息:
Class<?> c = List.class;
但这通常是不可行的,实际上我正在尝试解决需要该类型信息的更大问题。
虽然我知道我可以轻松禁用警告或使用类似的肮脏技巧,但我想知道获取 List 的类对象的正确方法是什么。