猿问

将类对象作为泛型类型的 Java 泛型

我想为使用泛型定义的类创建一个 Java 对象。具体来说,我想创建一个在运行时确定的类的对象列表。

我想要类似的东西

Class clazz = Class.forName("MyClass");
List<clazz> myList = new ArrayList<>(); // This isn't allowed

定义一个对象数组将允许我存储 MyClass 类型对象的列表,但这会导致每次从列表中获取对象时都转换对象,我想避免这种情况。

有没有办法使用java.lang实现类似上面的代码。


跃然一笑
浏览 245回答 3
3回答

哔哔one

好吧,既然你知道那个类,你可以(有警告)投射它List本身;但是您仍然需要知道类名并进行一些检查,例如:if(clazz.getName().equals("java.lang.String")) {&nbsp; &nbsp; &nbsp;// warning here&nbsp; &nbsp; &nbsp;yourList = (List<String>) yourList;&nbsp;}

一只斗牛犬

不,你不能。Java 中的泛型只是一种编译时类型检查机制。如果直到运行时才知道类型,那么显然它不能用于编译时类型检查。编译器无法在编译时确定允许您放入或取出 a 的类型List<clazz>,因此它仅比原始类型更有意义List。

四季花海

有一个小技巧可用于处理特定的未知类型:声明一个仅用于未知类型的类型参数:public <T> void worksWithSomeUnknownClass() throws ReflectiveOperationException {&nbsp; &nbsp; @SuppressWarnings("unchecked")&nbsp; &nbsp; Class<T> clazz = (Class<T>) Class.forName("MyClass");&nbsp; &nbsp; T obj = clazz.getConstructor().newInstance();&nbsp; &nbsp; List<T> myList = new ArrayList<>();&nbsp; &nbsp; myList.add(obj);}但是,此解决方案非常有限。它可以确保您不会与其他未知类型或混合起来Object,但你真的不能做任何事情T。并且您必须在使用它的每个方法上声明一个类型参数。
随时随地看视频慕课网APP

相关分类

Java
我要回答