第25条:列表优先于数组

数组与泛型相比,有两个重要的不同点。数组是协变的(如果Sub是Super的子类型,那么数组类型Sub[]是Super[]的子类型),相反,泛型是不可变得,对于任意两个不同的类型T1和T2,List<T1>和List<T2>没有子类型或超类型的关系。

//这段代码在运行时出错
Object[] o = new Long[1];
o[0] = "I don‘t fit it";

//这段代码在编译时出错
List<Object> o = new ArrayList<Long>();
o.add("I don‘t fit it";

一段代码:

static <E> E reduce(List<E> list, Function<E> f, E initVal) {
    E[] snapshot = (E()) list.toArray();
    E result = initVal;
    for(E e : snapshot)
        result = f.apply(result, e);  return result;
}

会有一条警告,编译器无法再编译时知道E是什么,所以是一个非受检的警告。

修改成列表代替数组:

static <E> E reduce(List<E> list, Function<E> f, E initVal) {
    List<E> snapshot;
    synchronized(list) {
        snapshot = new ArrayList<E>(list);
    }
    E result = initVal;
    for(E e : snapshot)
        result = f.apply(result, e);
    return result;
}

这样不会再收到警告,因为编译器可以保证类型转换自动进行,不会出错。

时间: 2024-07-29 08:13:37

第25条:列表优先于数组的相关文章

第26条:优先考虑泛型

考虑第6条的简单堆栈实现: public class Stack { pprivate Object[] elements; private int size = 0; private static final int DEFAULT_INITAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITAL_CAPACITY]; } public void push(Object e) { ensureCapacity

[实战]MVC5+EF6+MySql企业网盘实战(25)——种子列表

写在前面 上篇文章实现了视频列表,本篇文章继续实现其他的文件列表.功能相似.这里就不再赘述. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) [实战]MVC5+EF6+MySql企业网盘实战(2)——用户注册 [实战]MVC5+EF6+MySql企业网盘实战(3)——验证码 [实战]MVC5+EF6+MySql企业网盘实战(4)——上传头像 [Bootstrap]modal弹出框 [实战]MVC5+EF6+MySq

美国妈25条规范让孩子人人爱

BWCHINESE中文网讯,如何能培养一个有教养而又模范的孩子?美国父母网站总结发表了25条注意事项,只要孩子在九岁前学会这些礼貌语言和行为,他们就会成为人见人爱的模范孩子. 1,如果孩子要什么,要很有礼貌地请求,一定能够要加个“请”字.“我要吃糖”不行,应该说“请给我一点糖”.最好还做个友好的努力,带着微笑请求. 2,人家给你什么,不要马上离开,给东西的人会感觉被冒犯了,一定要说声“谢谢”.也可以很有创意地道谢,比如说画张画,或者回送张卡片. 3,孩子不能随便打断父母的对话,等大人说完话了,他

Effective JavaScript Item 46 优先使用数组而不是Object类型来表示有顺序的集合

本系列作为Effective JavaScript的读书笔记. ECMAScript标准并没有规定对JavaScript的Object类型中的属性的存储顺序. 但是在使用for..in循环对Object中的属性进行遍历的时候,确实是需要依赖于某种顺序的.正因为ECMAScript没有对这个顺序进行明确地规范,所以每个JavaScript执行引擎都能够根据自身的特点进行实现,那么在不同的执行环境中就不能保证for..in循环的行为一致性了. 比如,以下代码在调用report方法时的结果就是不确定的

25条提高iOS App性能的建议和技巧

这篇文章来自iOS Tutorial Team 成员 Marcelo Fabri, 他是 Movile 的一个iOS开发者. Check out his personal website or follow him on Twitter.原文地址      当我们开发iOS应用时,好的性能对我们的App来说是很重要的.你的用户也希望如此,但是如果你的app表现的反应迟钝或者很慢就会让你得到不好的评论. 然而,由于IOS设备的限制有时很难工作得很正确.我们开发时有很多需要我们记住这些容易忘记的决定

25条提高iOS App性能的技巧和诀窍

 这篇文章来自iOS Tutorial Team 成员 Marcelo Fabri, 他是 Movile 的一个iOS开发者. Check out his personal website or follow him on Twitter.原文地址      当我们开发iOS应用时,好的性能对我们的App来说是很重要的.你的用户也希望如此,但是如果你的app表现的反应迟钝或者很慢也会伤害到你的审核. 然而,由于IOS设备的限制有时很难工作得很正确.我们开发时有很多需要我们记住这些容易忘记的决定对

MYSQL之性能优化 ----MySQL性能优化必备25条

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过 多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这些优化技巧对你有用. 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被

[转]25条提高iOS App性能的技巧和诀窍

以下这些技巧分为三个不同那个的级别---基础,中级,高级. 基础 这些技巧你要总是想着实现在你开发的App中. 1. 用ARC去管理内存(Use ARC to Manage Memory) 2.适当的地方使用reuseIdentifier(Use a reuseIdentifier Where Appropriate) 3.尽可能设置视图为不透明(Set View as Opaque When Possible) 4.避免臃肿的XIBs文件(Avoid Fat XiBs) 5.不要阻塞主进程(D

25条Python知识点,面试命中高达95%

1.到底什么是Python?你可以在回答中与其他技术进行对比 下面是一些关键点: Python是一种解释型语言.这就是说,与C语言和C的衍生语言不同,Python代码在运行之前不需要编译.其他解释型语言还包括PHP和Ruby. Python是动态类型语言,指的是你在声明变量时,不需要说明变量的类型.你可以直接编写类似x=111和x="I'm a string"这样的代码,程序不会报错. Python非常适合面向对象的编程(OOP),因为它支持通过组合(composition)与继承(i