2017-07-26 99 views
3

你如何实例化一个Java泛型对象是需要键入只给出一个ClassClass<?>对象参数的Java类型参数/通用?使用实例化一个Class对象

例如: 通常可以使用以下语法实例IntegerArrayList的对象:

ArrayList<Integer> foo = new ArrayList<Integer>(); 

然而,在给定Class<?>对象如Integer.class,一个如何可以创建一个类似ArrayList?例如,我怎么会做这样的事情(不正确的语法):

ArrayList<Integer.class> foo = new ArrayList<Integer.class>(); 

我需要这个东西非常不寻常的,我与Java做(创建可视化数据结构的用户提供的情况下,一个开源工具/他们写的泛型类)。下面是我将如何使用此代码示出了I将给予信息的示例:

import java.util.ArrayList; 
import java.util.List; 

public class ArrayListFromClass { 
    // obviously this code does not work 
    public static void main(String[] args) { 
     Object givenObject = new Integer(4); 
     // I would not know it is Integer.class, a Class<?> object would be supplied by the user/ as a generic 
     Class<?> cls = givenObject.getClass(); 
     List<cls> bar = new ArrayList<cls>(); 

     // Where args[0] is "Integer.class" 
     List<args[0]> foo = new ArrayList<args[0]>(); 

     // then I would be able to add to foo or bar with one or both of these techniques: 
     // printing givenObject.getClass() gives you java.lang.Integer, don't worry about the casting not working. 
     bar.add(cls.cast(givenObject)); 
     Integer y = 6; 
     bar.add(y); 
    } 
} 
+0

如果向下票,请让我知道我可以在将来写出更好/更富有建设性的帖子,或者我怎么可以编辑这一项。我对SO很了解。 – BlueOxile

+0

这不是一个可以使用Java泛型(编译时类型检查机制)的地方。既然你想能够存储任何类型,只需使用Object。然后,当迭代适当处理单个实例时,您还需要使用* reflection *。 –

+0

这篇文章被低估了,因为之前已经被问过这么多次,而且你没有显示任何先前研究的证据。我真的很惊讶它是upvoted。 –

回答

0

您不必担心泛型参数。 原来,通用参数实际上是在运行时擦除的(请参阅type erasure)。

所以,你只需要让它List<Object>

这可能看起来像一个问题,但它很少重要。你只需要跟踪你输入的类型,并确保你删除并正确投射。大多数情况下使用反射的时候,你的Object的具体类型不是真的问题,因为你调用方法,并间接访问字段。

1

Java是静态类型的。究其原因,你会想要实例化一个ArrayList像这样:

ArrayList<Integer> foo = new ArrayList<>(); 

就是让你的IDE /编译器知道,每当比Integer以外的东西放入列表,显示错误。除此之外,内部将忽略此初始化,实际上甚至erase the type

所以,当你在运行时让你Class<?>对象,你只知道类的类型时,你的代码实际运行。因此IDE /编译器无法在运行前警告您代码中是否存在错误。

所以一个List<Object>将你的情况做就好了。如果你想输入的安全,你必须检查你自己像这样:

String sampleString = "String"; 
    Class<?> clazz = sampleString.getClass(); 
    ... 
    if (clazz.isInstance(sampleString)) { 
     list.add(sampleString); 
    } 

.isInstance(Object obj)instanceof相当于当你真正拥有Class<?>在眼前。