繁体   English   中英

Java - 创建扩展List的对象

[英]Java - Creating an object extending List

如何创建具有指定类型参数的列表? 例如:

LinkedList<Integer> list = createList(LinkedList.class, Integer.class);

我已经尝试为它创建一个方法,但该方法在创建新实例时不包含type参数。

public static <T, L extends List<T>> L createList(Class<L> listClazz, Class<T> valueClazz) throws Exception
{
    return listClazz.getConstructor().newInstance();

    //Instead of
    //  new L<T>();
    //does
    //  new L();
}

我希望我的问题很清楚,谢谢你的帮助。

你不能这样做。 泛型在运行时没有业务,因此您无法使用反射在运行时创建参数化实例。 在运行时, LinkedList<Intege>只是一个LinkedList 类型信息 - Integer在编译时通过“类型擦除”被擦除。 关键是,你为什么要这样做?

 //Instead of // new L<T>(); //does // new L(); 

这两个“做”完全相同的事情。 你怎么知道它“做”而不是另一个? 类型参数是用于类型检查的编译时幻象。 它们与代码“做”无关。 要创建LinkedList<T>的实例,您不需要知道T是什么,因为它在类型擦除后并不存在。

我认为你遇到的问题与函数内部的代码无关,而是与方法的签名有关。 通过这一事实,该方法被声明为是,和要传递类型的表达式Class<LinkedList> (类型LinkedList.class )给它, L必须是LinkedList ,并且由于该方法返回L ,编译器必须考虑通过LinkedList类型返回它。 这些都与方法内的代码无关。

如果希望将方法的返回类型视为LinkedList<Integer> ,则只需传入Class<LinkedList<Integer>>类型的表达式。 简单吧? 如何获得Class<LinkedList<Integer>>类型的表达式? 首先,你可以做(Class<LinkedList<Integer>>)(Class<?>)LinkedList.class

如果这看起来有点虚假,那是因为Class基本上是一个运行时的东西 - 它允许运行时从该类创建一个对象。 将它与Generics(编译时类型检查机制)一起使用从根本上是有缺陷的。 任何类都只有一个类对象,例如LinkedList LinkedList还是LinkedList<Integer>LinkedList<String> 好吧,它可能就是所有这些,在某种意义上, newInstance()方法可以创建它们中的任何一个(在运行时没有区别)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM