作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
出于纯粹的好奇心,有:
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)
最佳答案
List<List> partitions = Lists.partition(bigList , 10);
Lists.partition(bigList , 10)
这两行代码将在运行时执行完全相同的操作。区别在于编译时前者将被强制解释为 List<List>
(带有编译器警告,因为这是一个潜在危险的事情)而后者被假定为原始 List
.
当迭代 List<List>
时,元素将被假定为 List
。但对于原始类型,元素将被假定为 Object
。因此,这会破坏:
for (List partition : Lists.partition(bigList , 10)) {}
...因为您正在尝试分配 Object
到 List
变量。
我还想重申我在评论中提到的内容:不要使用原始类型,除非您有非常充分的理由这样做,并且完全了解这样做的风险和后果。由于 Java 的类型删除,使用原始类型将使您失去列表包含其声称包含的内容的所有保证,如果遇到错误的类型,可能会导致整个程序崩溃。
关于Java泛型返回对象而不是列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20043043/
我是一名优秀的程序员,十分优秀!