假设我有一个ArrayList,我已经强制转换为对象的ArrayList。我知道我投射的ArrayList中的所有对象都是相同的类型,但不是类型。
现在,如果ArrayList不为空,我可以使用其中的一个对象并使用instanceof运算符来了解实际类型。但是在ArrayList为空的情况下呢?我如何确定Object的实际类型呢?有可能吗?
编辑:回想起来,我认为空ArrayList的类型并不严格。我可以丢弃旧的并且构造一个我正在寻找的正确类型的新空ArrayList。
它有点乱,所以如果有人有关于如何允许各种可能不共享相关公共超类(例如Integer和ArrayList)的潜在类型的替代建议,我愿意接受建议。问题是,我有一个类,它将包含专门设计用于在其中互换的其他类。包含的类可以对类型进行假设,因为它们是定义它的类型。周围的类不能做出这样的假设,但必须确认它指定的类型与已插入其中的包含类相同。
因此我的问题是,包含类是通用的(通用指定它处理的类型),但它必须确保它所传递的包含的类返回并操作指定给它的类型(它们被设计为单独创建,因此它们匹配的事实必须在插入时确认,而不是在创建时确认。
答案 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()
方法......