第二十七条:优先考虑泛型方法

就如类可以从泛型中受益一般,方法也可以。静态工具方法尤其适合与泛型化。JDK中的Collections泛型中的

所有“算法”方法都泛型化了。

如:下面这个方法返回连个集合的联合。

public static  Set  union(Set  s1,Set  s2)

{

Set  result  = new  HashSet(s1);

result.addAll(s2);

return  result;

}

为了方法变成类型安全的,要将方法声明修改为声明一个类型参数。表示这三个集合的元素类型(两个参数和一个返回值),并在方法中

使用类型参数。声明类型参数的类型参数列表,处在方法的修饰符及其返回类型之间。在这个示例中,类型参数列表为<E>,返回类型为

Set<E>。类型参数的命名习惯与泛型方法以及泛型的相同,一般是E或者T。

改写为泛型方法如下:

public  static  <E>   Set<E>   union(Set<E>  s1,Set<E>  s2)

{

Set<E>  result  = new  HashSet<E>(s1);

result.addAll(s2);

return  result;

}

上面这个union方法的局限性在于,三个集合的类型(两个输入参数和一个返回值)必须全部相同。利用有限制的通配符类型,可以使这个方法更加灵活。

这个参加28条,这里不深入。

泛型方法还有一个比较重要的概念叫做类型推导。

我们在创建一个泛型集合实例时,这样写    Map<String , Integer>   map  =  new  HashMap<String , Integer>();

我们在调用泛型HashMap的构造器时,在new HashMap之后使用<String , Integer>指明了类型参数。那么我们在使用泛型方法的时候是否也需要这样做呢?

写出这样的代码 :Set.union<String>(s1,s2);   也就是说是否在需要调用方法的时候像调用构造器的那样在方法名后面指明类型参数。

答案是不需要  。   泛型方法会根据你具体传入的s1,s2的类型,来推断出类型参数E。如果你传入的s1,s2是HashSet<String>,那么类型参数E就是String;

如果你传入的s1,s2是HashSet<Integer>,那么类型参数E就是Integer。  一句话就是:泛型方法的类型参数根据传入的实际参数的类型而定,不需要再调用

时显示指明。

在JDK1.7之前,调用泛型的构造器需要在后面指明类型参数,但在JDK1.7中引入了菱形语法,只需要<>,不需要写类型参数。

时间: 2024-10-14 08:22:00

第二十七条:优先考虑泛型方法的相关文章

第二十七天 春之细雨润物于无形 —Spring的依赖注入

6月11日,晴."夏条绿已密,朱萼缀明鲜.炎炎日正午,灼灼火俱燃." IT人习惯把具体的事物加工成的形状一致的类,正是这样的一致,加上合适的规范,才能彰显对象筋道的牙感和bean清香的味道.Spring比谁都清楚OO的奥妙,让组件之间的依赖关系由容器在运行时期决定,称作依赖注入(Dependency Injection). 下面用一通俗的例子,一探依赖注入奥妙. 设计模式中的一个原则:针对接口编程,不要针对实现编程. 一.设计两个接口: (1)奶制品接口-MilkProductInte

centos samba/squid 配置 第二十七节课

centos  samba/squid 配置  第二十七节课 上半节课 下半节课 一. samba配置1. 什么是sambaSamba服务类似于windows上的共享功能,可以实现在Linux上共享文件,windows上访问,当然在Linux上也可以访问到.是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务. 注意:smb侦听端口:139  和  445  端口 2. 安装配置samba yum install -y samba samb

Gradle 1.12用户指南翻译——第二十七章. Ear 插件

其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个程序浏览文档,带缓存功能的,目前

[转]成功的十七条黄金定律

国著名作家Charles Reade有一段很有名的格言:Sow a thought,and you reap an act,Sow an act, and you reap a habit; sow a habit,and you reap a character; sow a character, and you reap a destiny.( 播下一种思想,收获一种行为:播下一种行为,收获一种习惯:播下一种习惯,收获一种性格:播下一种性格,收获一种命运.)美国著名心理学家马斯洛也曾说过这样

javaSE第二十七天

第二十七天????447 1:反射(理解)????447 (1)类的加载及类加载器????447 (2)反射:????448 A:定义????448 B:获取字节码对象的三种方式????449 (3)反射的使用????450 A:通过反射获取构造方法并使用????450 1).反射获取构造方法的介绍????450 2)通过反射去获取该构造方法并使用????451 3)通过反射获取私有构造方法并使用????452 B:通过反射获取成员变量并使用????452 C:通过反射获取成员方法并使用????

“全栈2019”Java多线程第二十七章:Lock获取lock/释放unlock锁

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第二十七章:Lock获取lock/释放unlock锁 下一章 "全栈2019"Java多线程第二十八章:公平锁与非公平锁详解 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回

第二十七个知识点:什么是对称密码加密的AEAD安全定义?

第二十七个知识点:什么是对称密码加密的AEAD安全定义? AEAD 在之前的博客里,Luke描述了一种被广泛使用的操作模式(ECB,CBC和CTR)对块密码.我们也可能会想我们加密方案的完整性,完整性意味着接收到的消息就是发送的消息,在信道中没有意外修改或者恶意修改,真实性意味着接收者确实是收到了发送者的消息.为了使用这些特性,我们通常使用消息认证码(MAC),那些基于hash的消息认证码叫做HMAC.把这两个密码原语放在一起不是平凡的:为了获得IND-CCA安全方案,我们需要遵循加密然后MAC

第二十七天反射和面向对像中的内置函数

1.isinstance判断类和对象之间的关系如果存在类对象关系返回True否则返回False class Person: def func(self): pass a=Person() b=1 print(isinstance(a,Person)) #左边对象右边类 print(isinstance(b,Person)) 结果为 True False 2.issubclass判断是否是子类和父类之间的关系: class Person: def func(self): pass class So

第27条:优先考虑泛型方法

如类可以从泛型中受益,方法也一样.静态工具方法尤其适合于泛型化.Collections中所有的方法是泛型化的. 一个返回两个集合的联合的例子: publlic static Set union(Set s1, Set s2) { Set result = new HashSet(s1); result.addAll(s2); return result; } 有两条警告,因为使用的是原生态类型Set. 泛型化该方法: public static <E> Set<E> union(S