【问题标题】:How to set the generic type of an ArrayList at runtime in java?java - 如何在运行时在java中设置ArrayList的泛型类型?
【发布时间】:2013-02-03 08:46:19
【问题描述】:

好的,所以我正在设置我自己的 XML 序列化(我知道还有其他的,甚至一些内置于 Java 中,但我自己这样做是为了学习,因为使用它非常棒)。我已经序列化了。我目前正在进行反序列化(读取 XML 文件并根据文件中的数据组装对象),并且在设置泛型类型时遇到了问题。经过广泛的研究,我想出了如何获取类的泛型类型,以便在序列化时编写它们,但我不知道如何做到这一点:

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

我在 C# 中看到了一些答案,但显然 C# 比 Java 更通用,我无法在 Java 中复制那里的解决方案。即使有反射,这也能做到吗?

【问题讨论】:

  • 你不能。泛型只是编译时语法糖。
  • @TJCrowder - 是的......大多数时候我只是觉得它可能需要一个比我想在晚上这个时候输入的更好的解释:)但我会咬 - 感动回答。
  • 你不能。这个问题没有意义。泛型是由编译器擦除的编译时机制。运行时的总影响为零。所以即使你能做到,结果也不会改变。

标签: java generics reflection


【解决方案1】:

你不能。

Java 中的泛型只是编译时语法糖。它使您不必像过去恐龙在 JVM 中漫游时那样在 Object 之间转换所有内容,并为您提供一些编译时类型检查。

编辑以添加:一些在运行时保留的元数据,您可以通过反射获得 inspect 一个泛型类,但什么也没有喜欢你想要的。

【讨论】:

  • 哦,开车投票的人,请告诉我。还是我再次在网上伤害了某人的感情?
  • 没有受伤的感觉:我只是觉得你的回答有误导性,即使有资格,所以我投了反对票。
  • @Daniel - 究竟什么是误导或不正确的?请放纵我。
  • 是的,没那么多。你不能那样做。我正在考虑如何通过选角来做到这一点,但我做不到了,但已经很晚了,我已经喝了几杯啤酒(抱歉)。
  • @jchitel - 我的意思是 - 如果您不需要它是 完全 动态的(例如,您有一组有限的类型),您可以创建一个工厂根据字符串创建正确的东西。
【解决方案2】:

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

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

Type Erasure StackOverflow

Type Erasure Tutorial

【讨论】:

    【解决方案3】:

    你可以做什么(如果你的类数量有限)..你可以通过使用'instance of'运算符并根据你的arraylist中的那个位置来检查对象

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

    你可以嵌套 if else 或 switch

    【讨论】:

      【解决方案4】:

      不,泛型仅在编译时,仅用于编译时类型检查,以允许您避免可以在编译时证明安全的强制转换。

      考虑一下。如果你能做你想做的,那将是完全没有用的。比如说,拥有ArrayList&lt;String&gt; 的全部意义在于,当您从中获取一个元素时,编译器可以在编译时推断它的类型为String,因此它允许您将其分配给类型@987654323 @ 在没有演员表的代码中。此外,如果您尝试向其中添加元素,编译器可以在编译时检查它的类型是否为 String,否则不会让您这样做。

      但是你想要一个在编译时不知道的类型参数。因此,当您从中取出一个元素时,编译器对其类型一无所知,因此您只能将其分配给类型Object。而且当你尝试往里面放东西时,编译器不知道它应该允许什么类型,所以它必须允许所有类型?那么泛型就没有意义了。

      因此,您应该只使用上限类型作为类型参数。赞ArrayList&lt;Object&gt; list = new ArrayList&lt;Object&gt;();

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-19
        相关资源
        最近更新 更多