【问题标题】:Finding the specific type held in an ArrayList<Object> (ie. Object = String, etc.)查找 ArrayList<Object> 中保存的特定类型(即 Object = String 等)
【发布时间】:2011-11-16 01:46:43
【问题描述】:

假设我有一个 ArrayList,我已将其转换为对象的 ArrayList。我知道我投射的 ArrayList 中的所有对象都是同一类型,但不是什么类型。

现在,如果 ArrayList 不为空,我可以取其中一个对象并使用 instanceof 运算符来了解实际类型是什么。但是 ArrayList 为空的情况如何呢?那么我如何确定 Object 的实际类型呢?有可能吗?

编辑:回想起来,我认为空的 ArrayList 拥有什么类型并不重要。我可以丢弃旧的并构造一个新的空 ArrayList,它是我首先要寻找的正确类型。

这有点混乱,所以如果有人对如何允许大量可能不共享相关公共超类(例如 Integer 和 ArrayList)的潜在类型有替代建议,我愿意接受建议。问题是,我有一个类,其中包含专门设计用于在其中可互换使用的其他类。包含的类可以对类型做出假设,因为它们是定义它的类。周围的类不能做出这样的假设,但必须确认它指定的类型与已插入其中的包含类相同。

因此我的问题是,因为包含类是泛型的(泛型指定它正在处理的类型),但它必须确保它传递的包含类返回并在指定给它的类型上运行(它们设计为单独创建,因此必须在插入时确认它们匹配的事实,而不是在创建时确认)。

【问题讨论】:

  • 我认为一个更好的问题是问你如何做你想做的事情是否是最好的方法,因为我在一天中看到了一两行代码并且我没有看到任何需要您粗略描述的解决方案。
  • 为了进一步澄清,它是一种模块化设计。问题是用户很容易传递错误类型的模块。
  • 呃,输入太早了。举个例子:EX。爬山搜索算法模块,它包含两个子模块:一个状态模块和一个启发式模块。状态的设计考虑了精确的结构,但爬山算法可以在多种状态上运行。爬山算法必须处理状态模块可能传递给它的任何形式。虽然回想起来,设计可能只使用 Object,因为爬山不需要严格地做任何事情,而是传递它......
  • 当你发现那个类型时你会怎么做?做案例分析? 您的应用程序中的空列表有什么意义?

标签: java generics casting


【解决方案1】:

不,type erasure 确保这一点。

【讨论】:

  • 您说得对。只用一句话就可以完整回答他的问题的奖励积分。
【解决方案2】:

正如 Jeffrey 所说,由于类型擦除的魔法,这是不可能的。我猜你最好的选择是为空列表添加一个额外的案例:

    if (list.isEmpty()) {
        // process empty ...
    } else {
        Object o = list.get(0);
        if (o instanceof Integer) {
            List<Integer> integers = (List<Integer>) list;
            // process Integer ...
        } else if (o instanceof String) {
            List<String> strings = (List<String>) list;
            // process String ...
        } // etc...  
    }

但要小心!这个instanceof 链通常不被认为是好的OO 实践。与其传递裸列表然后尝试猜测它们的组成类型,不如考虑为列表创建一个包装类,该类也可能包含对Class 对象的引用。这样,您还可以将不同的处理算法重构为覆盖单个 process() 方法...

【讨论】:

    猜你喜欢
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 2014-06-14
    相关资源
    最近更新 更多