简体   繁体   English

如何获取泛型类型的类?

[英]How to get Class for generic type?

How can I create a Class that represents a generic object?如何创建一个Class代表一个通用对象?

List<String> list = new List<String>();
Class c1 = list.class;
Class c2 = Class.forName(???); // <- how?
assert c1 == c2;

A class object is not specific to the particular class that is satisfying its type parameter:类对象并不特定于满足其类型参数的特定类:

assert (new ArrayList<String>()).getClass() == (new ArrayList<Integer>()).getClass();

It's the exact same object regardless of how it's typed.不管它是如何输入的,它都是完全相同的对象。

You can not, since generic information is not present during runtime, due to type erasure .你不能,因为通用信息在运行时不存在,由于类型擦除

Your code can be written like:你的代码可以这样写:

List<String> list = new ArrayList<String>();
Class c1 = list.getClass();
Class c2 = Class.forName("java.util.ArrayList");
System.out.println(c1 == c2); // true

Class does not represent general types. Class不代表一般类型。 The appropriate type to use is java.lang.reflect.Type , in particular ParameterizedType .要使用的适当类型是java.lang.reflect.Type ,特别是ParameterizedType You can get these objects via reflection or make your own.您可以通过反射获取这些对象,也可以创建自己的对象。

(Note, generics is a static-typing feature so isn't really appropriate for runtime objects. Static typing information happens to be kept in class files and exposed through the reflection API on reflective objects.) (注意,泛型是一种静态类型特性,因此并不适合运行时对象。静态类型信息恰好保存在类文件中,并通过反射对象上的反射 API 公开。)

This worked for me: (Class<List<MYTYPE>>) Class.forName("java.util.ArrayList")这对我(Class<List<MYTYPE>>) Class.forName("java.util.ArrayList")(Class<List<MYTYPE>>) Class.forName("java.util.ArrayList")

So for your case:所以对于你的情况:

List<String> list = new List<String>();
Class c1 = list.class;
Class c2 = (Class<List<String>>) Class.forName("java.util.ArrayList")
assert c1 == c2;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM