泛型类的类对象(java)

泛型类的类对象(java),java,generics,Java,Generics,java中是否有一种方法可以获取类似Class的实例?您可以使用以下方法获取列表类型的类对象: Class.forName("java.util.List") 或 但是,由于java泛型是使用实现的,所以无法为每个特定类获得专门的对象 List.class 特定类型的泛型在编译时被“擦除”。由于类型擦除,在类级别,所有列表接口都是相同的。它们只是在编译时不同。因此,您可以将类作为一个类型,其中列表。类属于该类型,但您无法获得比该类型更具体的内容,因为它们不是独立的类,只是类型声明,编译器将其

java中是否有一种方法可以获取类似
Class
的实例?

您可以使用以下方法获取列表类型的类对象:

Class.forName("java.util.List")

但是,由于java泛型是使用实现的,所以无法为每个特定类获得专门的对象

List.class

特定类型的泛型在编译时被“擦除”。

由于类型擦除,在类级别,所有列表接口都是相同的。它们只是在编译时不同。因此,您可以将
作为一个类型,其中
列表。类
属于该类型,但您无法获得比该类型更具体的内容,因为它们不是独立的类,只是类型声明,编译器将其擦除为显式类型转换。

如其他答案中所述,
表示已擦除的类型。要表示类似于
ArrayList
,需要一个
类型
。一个简单的方法是:

new ArrayList<Object>() {}.getClass().getGenericSuperclass()
new ArrayList(){}.getClass().getGenericSuperclass()
1.5中引入的泛型API相对容易找到解决方法。

如何

(Class<List<Object>>)(Class<?>)List.class
(Class)(Class)List.Class
公共最终类ClassUtil{
@抑制警告(“未选中”)
公共静态类castClass(类aClass){
返回(类)aClass;
}
}
现在你叫:

Class<List<Object>> clazz = ClassUtil.<List<Object>>castClass(List.class);
Class clazz=ClassUtil.castClass(List.Class);

您可以使用Jackson的
ObjectMapper

ObjectMapper objectMapper = new ObjectMapper();
CollectionType listType = objectMapper.getTypeFactory().constructCollectionType(List.class, ElementClass.class)

没有未检查的警告,没有空列表实例到处浮动。

奇怪。。。在不创建对象的情况下没有办法做到这一点?不仅仅是创建一个新对象,一个新类(在本例中是一个匿名的内部类)。但那个例子应该是新的ArrayList,不是吗?制作一个匿名列表需要你实现所有的方法。它是getGenericSuperclass而不是getGenericSupertype。还有实现多个接口的问题。Jason s:一个对象谁在乎?有很多方法可以不用新的,但是你在代码中使用了大量的内存。但是你仍然需要进行未经检查的转换。我喜欢这个想法。它会导致未经检查的演员警告,但我想它很容易被忽略。谢谢分享!这太棒了。例如,我今天需要解决一个困难的泛型问题。真的需要
(类)
?在我的测试中,它似乎是
(Class)List。Class
就足够了。@alarive:
List。Class
的类型是
Class
。从
Class
Class
的强制转换是非法的(因为没有类型可能是两者的子类型)checked@MonkeySupersonic:如果您得到“类型列表不是泛型的”,那么您的“列表”类型是错误的(可能是类
java.awt.List
而不是接口
java.util.List
)。检查你的进口。这主意不错。这与执行
(Class)(Class)List.Class基本相同,但是如果您需要几个Class对象,则在ClassUtil中只有一个未选中的强制转换。我喜欢它,因为您不创建新对象。酷。谢谢
Class<List<Object>> clazz = ClassUtil.<List<Object>>castClass(List.class);
ObjectMapper objectMapper = new ObjectMapper();
CollectionType listType = objectMapper.getTypeFactory().constructCollectionType(List.class, ElementClass.class)