获取具有泛型信息的类名

时间:2010-04-13 14:51:20

标签: java generics serialization

在java序列化问题中,我想保存一些类名,我对泛型类有一些问题。 例如:
- 如果我有ArrayList<String> listToDump = new ArrayList<String>();
- 如果我取名:listToDump.getName();listToDump.getCanonicalName();
- 我会java.util.ArrayListArrayList
- 我希望java.util.ArrayList<String>ArrayList<String>

关于我如何做到这一点的任何想法?
达明。

5 个答案:

答案 0 :(得分:6)

  1. 您所描述的案例不起作用,您可能会listToDump.getClass().getName()

  2. 由于type erasure,无法在运行时获取有关泛型类型的信息:

      

    实例化泛型类型时,   编译器通过转换这些类型   一种称为类型擦除的技术 - a   编译器删除所有的进程   与类型参数相关的信息   并在类或中键入参数   方法

  3. 如果您详细描述了您要解决的问题,那么我们可能会建议您使用一些解决方法甚至解决方案。类型擦除不应该​​是一个大问题,它只是可以改变做某事的方式。

答案 1 :(得分:3)

如果listToDump是字段,则可以使用Field.getGenericType()。但Java泛型在运行时被删除 - 只有一个普通的ArrayList实例。您可以查看其内容并找到常见的超类型,但是当涉及到接口时,这会变得非常棘手,并且可能比您想要的更具体。

但您实际上是如何计划使用这些信息的呢?

答案 2 :(得分:2)

由于type erasure而无法实现。

答案 3 :(得分:1)

切换到支持它的语言。

您描述的行为称为类型擦除,这就是用Java实现泛型的方式。

答案 4 :(得分:1)

我认为如果你从List中提取任何元素,那么尝试获取它的类名,你会得到你想要的结果。