由于泛型进行了介绍,类参数化,以使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())不工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top