我要扩展的泛型类之一要求返回正确泛型类型的类对象。我知道如何在正常情况下这样做,但当我的类包含泛型列表时就不知道了。例如,我知道如何实现下面的第一种方法,但不知道第二种方法:
public Class<String> getStringKlass() { return String.class; } public Class<List<String>> getStringListKlass() { ??? }
yuvru6vn1#
由于类型擦除,没有办法做到这一点:在java中,如果您有一个泛型类型(这里: List<T> )然后在编译时可以使用 List<String> , List<Date> 但是,在运行时,所有这些类型都由相同的 Class 对象。换句话说,下面的程序将输出 true :
List<T>
List<String>
List<Date>
Class
true
ArrayList<String> list = new ArrayList<String>(); System.out.println(list.getClass() == ArrayList.class);
flmtquvp2#
这很简单
List.class
通用信息在编译时存在。对于运行时,泛型被忽略,只有类的类型才重要。
8i9zcol23#
我最接近的方法就是创建一个新类来扩展 List<String> .
public class ListOfStrings extends ArrayList<String> { }
然后使用 <? extends List<String>> 而不仅仅是 List<String> 在您的方法中:
<? extends List<String>>
public Class<? extends List<String>> getStringListKlass() { return ListOfStrings.class; }
然而,我不知道这之后会给你的代码带来什么样的麻烦。
3条答案
按热度按时间yuvru6vn1#
由于类型擦除,没有办法做到这一点:在java中,如果您有一个泛型类型(这里:
List<T>
)然后在编译时可以使用List<String>
,List<Date>
但是,在运行时,所有这些类型都由相同的Class
对象。换句话说,下面的程序将输出
true
:flmtquvp2#
这很简单
通用信息在编译时存在。对于运行时,泛型被忽略,只有类的类型才重要。
8i9zcol23#
我最接近的方法就是创建一个新类来扩展
List<String>
.然后使用
<? extends List<String>>
而不仅仅是List<String>
在您的方法中:然而,我不知道这之后会给你的代码带来什么样的麻烦。