在java序列化问题中,我想保存一些类名,我对泛型类有一些问题。
例如:
- 如果我有ArrayList<String> listToDump = new ArrayList<String>();
- 如果我取名:listToDump.getName();
或listToDump.getCanonicalName();
- 我会java.util.ArrayList
或ArrayList
- 我希望java.util.ArrayList<String>
或ArrayList<String>
关于我如何做到这一点的任何想法?
达明。
答案 0 :(得分:6)
您所描述的案例不起作用,您可能会listToDump.getClass().getName()
由于type erasure,无法在运行时获取有关泛型类型的信息:
实例化泛型类型时, 编译器通过转换这些类型 一种称为类型擦除的技术 - a 编译器删除所有的进程 与类型参数相关的信息 并在类或中键入参数 方法
如果您详细描述了您要解决的问题,那么我们可能会建议您使用一些解决方法甚至解决方案。类型擦除不应该是一个大问题,它只是可以改变做某事的方式。
答案 1 :(得分:3)
如果listToDump
是字段,则可以使用Field.getGenericType()。但Java泛型在运行时被删除 - 只有一个普通的ArrayList
实例。您可以查看其内容并找到常见的超类型,但是当涉及到接口时,这会变得非常棘手,并且可能比您想要的更具体。
但您实际上是如何计划使用这些信息的呢?
答案 2 :(得分:2)
由于type erasure而无法实现。
答案 3 :(得分:1)
切换到支持它的语言。
您描述的行为称为类型擦除,这就是用Java实现泛型的方式。
答案 4 :(得分:1)
我认为如果你从List
中提取任何元素,那么尝试获取它的类名,你会得到你想要的结果。