你基本上不能。你的例子被打破了 -type
应该代表什么?
假设您要动态创建一个HashMap<String, Integer>
. 这需要你传入HashMap.class
,String.class
和Integer.class
,但是我们马上就遇到了很多问题:
- 我们怎么知道 HashMap 有 2 个参数?我们没有,因此您必须通过可变参数传递 2 个类引用,并且在运行时我猜如果您传递了错误数量的类,我们会抛出异常。
- 如果你传递了根本无法实例化的 Map 怎么办?
- 但最重要的是,这完全没用,没有出现在方法/字段/类签名中的泛型是编译器想象的虚构:javac 在编译期间使用它来警告或错误,以及生成不可见的种姓操作,以及然后把这个信息扔掉。通过动态地执行它,所有“在编译时”的东西都不能按定义工作(我们正在编译,而不是运行,重点是类型是动态的,所以 javac 不能这样做),所以对于 javac 它是无用的,然后信息被丢弃。所以这让它完全没用,那么,不是吗?
此外,Class
不能用于传达泛型参数。如果我想要一个HashMap<List<String>, Integer>
呢?List<String>
不作为类文字存在,因此java.lang.Class<T>
不能在此处使用。还有一些类对象(特别是int.class
)在泛型中是不合法的。因此,我们有?
, ? super Foo
, A, B extends A, C extends A & Serializable
,所有作为可以进入但不能作为参考List<String>
的事物的示例,这是一个合法的类 ref 但不能进入。你不能把方钉放在圆孔里。更不用说即使你可以,它实际上也不会做任何事情(见第 3 点:这是没用的——大多数泛型,当然你在这里使用的泛型,会影响编译并在之后不复存在)。<>
java.lang.Class
int.class
<>
这个领域有很多疯狂的技巧(例如超级类型标记),但是如果你不完全理解泛型是如何在后台工作的,那么你有 0.00001% 或更少的机会可以有效地使用这些技巧,所以不要'在那之前不要打扰。问这个问题,尤其是那个伪代码,强烈表明你对它的理解还不够。