如何设置泛型类型的ArrayList的在Java运行时?(How to set the generi

2019-07-19 04:10发布

好了,所以我建立我自己的XML序列化(我知道有其他人在那里,甚至有的建在为Java,但我做我自己学习,因为它是如此真棒一起工作)。 我有系列化下来。 我目前的反序列化(读取XML文件,并根据文件中的数据组装对象)和我正在与设置泛型类型的问题。 经过广泛的研究,我想通了,如何让泛型类的序列化所以,当我可以写他们,但我不知道如何做到这一点:

Class c = Class.forName(string);
ArrayList<c> list = new ArrayList<c>();

我看到在C#中这几个答案,但显然C#比Java更灵活一点,没有办法,我可以在Java中复制解决方案。 可即使这样做,甚至与反思?

Answer 1:

你不能。

在Java泛型只是编译时的语法糖。 但它使你不必投一切从Object就像我们在过去没有当恐龙出没的JVM,并给你一些编译时类型检查。

编辑补充:一些像你想要什么样的元数据在运行时,你可以通过反射去检查一个泛型类保留,但一无所获。



Answer 2:

你不能在运行时设置泛型类型。 所有泛型类型信息在编译时被删除。

请参阅以下文章了解类型擦除:

类型擦除的StackOverflow

类型擦除教程



Answer 3:

否则,你可以使用运营商的情况下“,并根据那个地方做什么(如果你有有限的班数)..你做对象的检查,在你的ArrayList

if(obj instance of abc)
    ArrayList<abc> al = new ArrayList<abc>();

你可以嵌套的if else或开关



Answer 4:

不,泛型是只在编译的时候,只为编译时类型检查,让您避免在编译时被证明是安全的转换。

想想吧。 如果你可以做你想做的,这将是完全无用的。 具有整点ArrayList<String> ,比方说,就是当你得到一个元素出来,编译器可以在它具有类型编译时推断String ,因此它允许您指定其输入String中代码没有投。 此外,如果您尝试将元素添加进去,编译器可以检查在编译时,它的类型为String ,否则不会让你做到这一点。

但你想要的是不是在编译时已知的类型参数。 因此,当你得到一个元素出来,编译器不知道它的类型什么,所以你只能将其指定类型Object 。 而当你试图把东西放到它时,编译器不知道它应该是什么类型允许,所以它必须允许所有类型? 那么有没有点到仿制药。

因此,你应该只使用上限类型作为类型参数。 像ArrayList<Object> list = new ArrayList<Object>();



文章来源: How to set the generic type of an ArrayList at runtime in java?