优雅编程之这样使用泛型,你就“正常”了(三十三)

开心一笑

【女:“一天中最幸福的时刻就是下班后你骑自行车载着我到街角那边吃卤肉饭。”
男:“说实话。”
女:“你骑自行车载我去吃卤肉饭。”
男:“说实话。”
女:“卤肉饭……”】

视频教程

大家好,我录制的视频《Java之优雅编程之道》已经在CSDN学院发布了,有兴趣的同学可以购买观看,相信大家一定会收获到很多知识的。谢谢大家的支持……

视频地址:http://edu.csdn.net/lecturer/994

提出问题**

java开发中如何更好使用范型???

解决问题

励志图片

以下来自《Effective Java》读书笔记:

请不要在新代码中使用原生态类型

参考高手文章:

http://www.cnblogs.com/nayitian/archive/2013/08/08/3245496.html

http://www.cnblogs.com/TwoWaterLee/p/5878056.html

参数化类型,通配符类型和原生态类型对比:

  • Set是个参数化类型,表示可以包含任何对象的一个集合;
  • Set< ? >则是一个通配符类型,表示只能包含某种未知对象类型的一个集合;
  • Set则是个原生态类型,它脱离了泛型系统。**前两种是安全的,最后一种不安全。

无限制通配类型和原生态类型的区别是:通配符类型是安全的,原生态类型不安全。你可以将任何元素放入到原生态类型的集合中,但不能将除了null之外的其他任何元素放到Collection

消除非受检警告

参考高手文章:
http://blog.csdn.net/lqadam/article/details/52563155

要尽可能地消除每一个非受检的警告。

使用@SuppressWarnings(“unchecked”)注解,需要注意的是将该注解用在尽可能小的范围内,能在变量上使用的不在方法上使用,能在方法上使用的不在类上使用。

使用@SuppressWarnings注解时,都要添加一条注释,说明为什么这么做是类型安全的

列表优先于数组

下面的代码片段是合法的,却是不符合预期:

// 运行时候失败
Object[] objectArray = new Long[1];
objectArray[0] = “I don’t fit in”; // Throws ArrayStoreException

但下面这段代码则不合法,但却提醒了你怎样才能达到预期:

// Won’t compile!
List<Object> o1 = new ArrayList<Long>(); // Incompatible types
o1.add(“I don’t fit in”);

明显,利用列表可以在编译时发现错误。我们当然希望在编译时发现错误了。

总结:数组是协变的,数组是具体化的:在运行时才知道并检查它们的元素类型约束

优先考虑泛型,优先考虑范型方法

定义泛型方法语法格式如下:

http://www.cnblogs.com/iyangyuan/archive/2013/04/09/3011274.html

引用高手的图片

参考高手文章:

http://www.cnblogs.com/cutter-point/p/5883279.html

修改前:

//这里使用原生类型是不合理的
 public static Set union1(Set s1, Set s2){
    Set result = new HashSet(s1);
    result.addAll(s2);
    return result;
}

修改后:

 //这里的范型没有安全警告
 public static <E> Set<E> union(Set<E> s1, Set<E> s2){
    Set<E> result = new HashSet<E>(s1);
    result.addAll(s2);
    return result;
}
利用有限制通配符来提升API的灵活性

参考高手文章:

http://www.cnblogs.com/13jhzeng/p/5726511.html

先看下面例子:

修改之前:

public void pushAll(Iterable<E> src) {  
    for (E e : src) {  
        push(e)  
    }  
}  

修改之后:

//src是生成者,所以使用extend
public void pushAll(Iterable<? extends E> src) {  
    for (E e : src) {  
        push(e)  
    }      
}      

pushAll的输入参数类型不应该为”E的Iterable接口”,而应该为”E的某个子类型的Iterable接口”,有一个通配符类型正符全此意:Iterable

优先考虑类型安全的异构容器

参考高手文章:

http://blog.csdn.net/zhang_amao/article/details/52107612

http://blog.csdn.net/tkd03072010/article/details/7722110

public Class Favorites{

    public <T> void putFavorite(Class<T> type, T instance);
    public <T> T getFavorites(Class<T> type);
}

Favorites实例是类型安全的:当你向它请求String的时候,不会返回一个Integer给你。同时它也是异构的:不像普通的map,它的所有的键都是不同类型的。因此,我们将Favorites称作类型安全的异构容器

Map不能保证键和值之间的类型关系,即不能保证每个值的类型都与键的类型相同,当你考虑到这个问题时,可以尝试使用类型安全的异构容器:

public class Favorites {
    private Map<Class<?>, Object> favorites =
            new HashMap<Class<?>, Object>();

    public <T> void putFavorites(Class<T> type, T instance) {
        if(type == null)
            throw new NullPointerException();
        favorites.put(type, type.cast(instance));
    }

    public <T> T getFavorites(Class<T> type) {
        return type.cast(favorites.get(type));
    }
}

读书感悟

来自三毛《稻草人手记》

  • 我们还年轻,长长的人生可以受一点风浪。
  • 我喜欢看见幸福的人,不管他们结不结婚。
  • 快回来吧!我希望把有生之年都静静地跟你分享。短短的人生我们不要再分开了啊。
  • 肉体的软弱是一时的 精神的胜利是永久的
  • 自由是多么可贵的事,心灵的自由更是我们要牢牢把握住的;不然,有了爱情仍是不够的。

其他

如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎转载,点赞,顶,欢迎留下宝贵的意见,多谢支持!

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿_毅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值