Java泛型返回对象而不是列表

时间:2013-11-18 08:19:58

标签: java generics

出于好奇心,有:

List bigList = new ArrayList();

为什么这段代码会编译:

List<List> partitions = Lists.partition(bigList , 10);
for (List partition : partitions) {}

这不是:

for (List partition : Lists.partition(bigList , 10)) {}

分区方法签名:

<T> List<List<T>> partition(List<T> list, int size)

1 个答案:

答案 0 :(得分:3)

List<List> partitions = Lists.partition(bigList , 10);

Lists.partition(bigList , 10)

这两行在运行时会完全相同。区别在于编译时,前者将被强制解释为List<List>(带编译器警告,因为这是一个潜在危险的事情),而后者被假定为原始List。 / p>

当迭代List<List>时,元素将被假定为List。但是对于原始类型,元素将被假定为Object。因此,这打破了:

for (List partition : Lists.partition(bigList , 10)) {}

...因为您尝试将Object分配给List变量。

我还想重申我在评论中提到的内容:不要使用原始类型,除非你有非常这样做的充分理由并充分理解这样做的风险和后果。由于Java的类型擦除,使用原始类型将使您失去列表包含其声称包含的内容的所有保证,如果遇到错误的类型,可能会导致整个程序崩溃。