查找ArrayList <object>中保存的特定类型(即Object = String等)</object>

时间:2011-11-16 01:46:43

标签: java generics casting

假设我有一个ArrayList,我已经强制转换为对象的ArrayList。我知道我投射的ArrayList中的所有对象都是相同的类型,但不是类型。

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

编辑:回想起来,我认为空ArrayList的类型并不严格。我可以丢弃旧的并且构造一个我正在寻找的正确类型的新空ArrayList。

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

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

2 个答案:

答案 0 :(得分:3)

不,type erasure确保了这一点。

答案 1 :(得分:0)

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

    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()方法......