这是我最近在一次采访中提出的一个问题,即候选人希望看到添加到Java语言中的问题.它通常被认为是一种痛苦,Java没有具体化的仿制药,但是,当被推动时,候选人实际上无法告诉我他在那里可能取得的那些事情.
显然因为原始类型在Java中是允许的(以及不安全的检查),所以可以颠覆泛型并最终List<Integer>得到(例如)实际包含Strings.如果类型信息具体化,这显然是不可能的; 但必须有更多!
人们可以发布他们真正想要做的事情的例子,是否有可用的具体化的泛型?我的意思是,显然你可以List在运行时得到一个类型- 但是你会用它做什么?
public <T> void foo(List<T> l) {
if (l.getGenericType() == Integer.class) {
//yeah baby! err, what now?
Run Code Online (Sandbox Code Playgroud)
编辑:对此的快速更新,因为答案似乎主要是关注需要传入Class一个参数(例如EnumSet.noneOf(TimeUnit.class)).我正在寻找更多的东西,这是不可能的.例如:
List<?> l1 = api.gimmeAList();
List<?> l2 = api.gimmeAnotherList();
if (l1.getGenericType().isAssignableFrom(l2.getGenericType())) {
l1.addAll(l2); //why on earth would I be doing this anyway?
Run Code Online (Sandbox Code Playgroud) 我想知道Java中是否有办法做类似的事情
Class c = List<String>.class;
Class c2 = List<Date>.class;
Run Code Online (Sandbox Code Playgroud)
我需要这样的东西来创建一个存储类名(带有泛型类型)的地图和我以后可以查找的相应对象.例如,
Map<Class, Object> dataMap = new HashMap<Class, Object>();
dataMap.put(c, listOfStrings);
dataMap.put(c2, listOfDates);
Run Code Online (Sandbox Code Playgroud)
这是不可能的,因为运行期间的类型擦除?
由于引入了泛型,因此Class被参数化,因此List.class生成Class <List>.这很清楚.
我无法弄清楚的是如何获得一个自身参数化的类型的实例,即Class <List <String >>.就像在这个片段中:
public class GenTest {
static <T> T instantiate(Class<T> clazz) throws Exception {
return clazz.newInstance();
}
public static void main(String[] args) throws Exception {
// Is there a way to avoid waring on the line below
// without using @SuppressWarnings("unchecked")?
// ArrayList.class is Class<ArrayList>, but I would like to
// pass in Class<ArrayList<String>>
ArrayList<String> l = GenTest.instantiate(ArrayList.class);
}
}
Run Code Online (Sandbox Code Playgroud)
我经常遇到这个问题的变化,我仍然不知道,如果我只是错过了什么,或者是否真的没有更好的方法.谢谢你的建议.
我需要调用一个超级构造函数,它要求我传递.class泛型类型的引用.我怎样才能用Java实现这一目标?
构造函数想拥有..
Class<List<MyType>>
Run Code Online (Sandbox Code Playgroud)
由于泛型在运行时被擦除,我不知道如何满足构造函数.
List<MyType>.class // does not work ;-)
Run Code Online (Sandbox Code Playgroud) 我需要声明一个实例Map.class,但Map是键入的......所以我需要这样的东西:
Class <Map<String, String>> clazz = Map.class;
Run Code Online (Sandbox Code Playgroud)
此行导致编译错误.表达这个的干净方式是什么?