题
由于泛型进行了介绍,类参数化,以使List.class 产生类<List>.这是清楚的。
什么我不能够找出是如何获得一个实例类型参数化本身,即类<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);
}
}
我碰到变化的这个问题相当经常并且我仍然不知道,如果我只是想念一些东西,或者如果真是没有更好的办法。谢谢你的建议。
解决方案
这类是一个运行的时间表示的类型。由于参数化的类型进行类型擦除在运行时,类对象的类同类<List<Integer>>和类<List<String>>.
原因,你不能化他们使用。类符号是,这是一个特殊的语法使用类文本。的 Java语言规范 具体地禁止这种语法当类型的参数化,这就是为什么名单<String>.类是不允许的。
其他提示
类表示类装载的一类装载程序,这是原类型。来表示一个参数化的类型,使用java。郎。反映。ParameterizedType.
我不认为你能做什么你都尝试。首先,你的实例的方法并不知道其处理参数化的类型(你可以很容易地通过它java.util.Date.class).其次,由于删除,这样做任何特别的具体类型参数化在运行时是困难或不可能的。
如果你要处理这个问题在不同的方式,还有其他的小技巧,你能做的,就像类型的推断:
public class GenTest
{
private static <E> List<E> createList()
{
return new ArrayList<E>();
}
public static void main(String[] args)
{
List<String> list = createList();
List<Integer> list2 = createList();
}
}
你唯一能做的就是实例 List<String>
直接 和呼它的 getClass()
:
instantiate(new List<String>() { ... }.getClass());
对于种类有多个抽象的方法一样 List
, 这是挺尴尬。但不幸的是,呼吁类的构造(喜欢 new ArrayList<String>
)或工厂的方法(Collections.<String>emptyList()
)不工作。
不隶属于 StackOverflow