【问题标题】:Create generic list, whereby type of the list known only at runtime创建通用列表,其中列表的类型仅在运行时知道
【发布时间】:2012-10-13 00:52:22
【问题描述】:

我想生成一个通用列表,其中列表的类型仅在运行时才知道(它是创建该列表的对象的类型)。

完整说明:

我想在一个抽象类中实现这个功能,所以我在运行前就知道父类。

不知道该怎么做。

    Class myClass = getClass().getSuperclass();
    LinkedList<myClass> list = new LinkedList<myClass>();

不起作用。有什么想法吗?

【问题讨论】:

  • 你可以参考这个链接:-blog.xebia.com/2009/02/07/…
  • 我认为你能做的最好的事情就是创建一个LinkedList&lt;Object&gt;。 Java 不是 Javascript。

标签: java generics types


【解决方案1】:

或者你可以写:

    List<Object> list = new LinkedList<Object>();

【讨论】:

  • +1 我会说这可能是比使用原始类型更好的选择,因为 Java 语言规范规定将来可能不允许使用原始类型。 JLS 4.8
  • 这是创建一个对象列表,而不是在运行时解析的类。不幸的是,它没有解决提出的问题。
【解决方案2】:

泛型在很大程度上是一种编译时特性,因此在这种情况下它没有任何意义。

你可以写

List list = new LinkedList();

如果可以使用,我通常更喜欢 ArrayList。 ;)

【讨论】:

  • 我对这个问题不是 100% 清楚,但如果 OP 真的要让它们用于各种类,是否应该将它们键入为 &lt;?&gt;
  • @Windle:除了null 之外,您不能向List&lt;?&gt; 添加任何内容。 ? 表示“未知但特定的类型”,而不是“任何东西”。
  • &lt;?&gt; 表示它不知道可以安全地添加什么类型,null 是唯一可以转换为任何值的值。你从列表中得到的将是一个Object
  • 如果不允许对特定类型的操作,那么泛型很适合在编译之前/编译时获取错误?但是如果我在编译之前不知道类型对我没有好处吗?
  • @MarkPeters 是的,我想我读错了。并不是说他可以将多种类型添加到一个列表中。以为他想在抽象类中声明列表,因此&lt;?&gt;,然后他会将其初始化为他用来扩展抽象的任何类型。不过我很欣赏这些回复 =)
【解决方案3】:

只需使用Non-Generics ArrayList

ArrayList arrList = new ArrayList();

即使你也可以使用&lt;?&gt;

认为使用List 会很好,因为它显示了"Program in Interface rather than implementation" 的原理

【讨论】:

  • 引用变量应该是 List 所以我们编程到接口
【解决方案4】:

另一种选择是使用扩展类的类型参数化抽象类。这有点过度设计,但应该可以:

package test;

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

public class  AbstractListHolder<T> {

    private List<T> list = new ArrayList<T>();

    List<T> getList() {
        return list;
    }

}

class ListHolder extends AbstractListHolder<ListHolder> {

    void doSomething() {
        getList().add(this);        
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-17
    • 2017-10-10
    • 2013-05-19
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2011-08-18
    相关资源
    最近更新 更多