以下类使用了泛型:
public class Container <E>{ private List<E> elements=new ArrayList<E>(); public void addAll(List<E> list){ elements.addAll(list); } public void removeAll(List<E> list){ list.addAll(elements); elements.clear(); } public static <T> List<T> union(List<? extends T> list1,List<? extends T> list2){ return null; } }
使用以下测试代码将报错:
List<Integer> list1=Arrays.asList(1,2,3); Container<Number> container=new Container<Number>(); container.addAll(list1);//编译时报错
以上测试代码,因为使用了Container<Number>声明,addAll()将仅接受List<Number>类型的参数值,所以当传入一个List<Integer>类型的参数将报错,尽管Integer是Number的子类
可以使用泛型通配符增加泛型方法的适应性,其基本原则为PECS(producer-extends,consumer-super),以上例,addAll()传入的list参数将提供数据给container对象,所以此list对象相对container来说是producer。同理,removeAll()传入的list参数将使用container移除的对象,所以此list是consumer。根据以上原则,修改方法如下:
public void addAll(List<? extends E> list){ elements.addAll(list); } public void removeAll(List<? super E> list){ list.addAll(elements); elements.clear(); }
所有Comparable、Comparator都是Consumer,在使用此接口时应使用如下声明:
public <T extends Comparable<? super T>> T max(List<T> list){ return null; }
以下测试union()的代码将报错,传入的参数分别是List<Integer>, List<Double>类型,导致编译器不知道应使用哪种参数类型(为什么编译器不从返回结果的类型List<Number>获取实际参数类型?)
List<Integer> list1=Arrays.asList(1,2,3); List<Double> list2=Arrays.asList(4.0d,5.0d,6.0d); List<Number> list=Container.union(list1, list2);//编译时报错
可以进行如下修改,显式指定编译器使用的实际参数类型为Number:
List<Number> list=Container.<Number>union(list1, list2);
使用泛型可以限制“容器”所能存储的元素的类型,如List<E>的限制容器List里仅能存放类型为E的元素。对应类似Map类型的容器,可以对key使用泛型,如下接口key的类型为Class<T>,而value为T,即value.class类型与key相同,这称为typesafe heterogeneous container:
注:可以调用Class.asSubclass() 进行类型转换
public class Favorites { public <T> void putFavorite(Class<T> type, T instance); public <T> T getFavorite(Class<T> type); }
具体实现类:
public class Favorites { private Map<Class<?>, Object> favorites = new HashMap<Class<?>, Object>(); public <T> void putFavorite(Class<T> type, T instance) { if (type == null) throw new NullPointerException("Type is null"); favorites.put(type, type.cast(instance));//避免放入与type类型不同的对象 } public <T> T getFavorite(Class<T> type) { return type.cast(favorites.get(type)); } }
相关推荐
导入kvm前请先编辑routeos.xml文件, RH7下运行测试通过, 本资源仅用于测试学习。
机器学习笔记,希望可以帮到你!!
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
*类 为 面向对象 调用 *参照了很多代码并结合自己的理解进行了原创设计和改进 *所有类方法基于(WinHttpRequest5.1)的特性封装完成 并加入了自动补全协议头和Cookies私有化管理架构 *WinHttpW(WinHttpApi)v2.9 ...
生成openssl静态库和clude文件及DLL动态库OpenSSL 是一个开源的第三方库,它实现了 SSL(Secure SocketLayer)和 TLS(Transport Layer Security)协议,被广泛企业应用所采用。对于一般的开发人员而言,在 Win32 ...
常用工具
使用openssl创建自签名证书,安装ActivePerl,ActivePerl是一个可以让你任意执行 Perl 程序的工具软件,其包含了包括有 Perl for Win32、Perl for ISAPI、PerlScript、Perl Package Manager四套开发工具程序,可以让...
Linux中的perl服务 32和64位都有,安装之后可在Linux中支持安装.pl文件
资源分类:Python库 所属语言:Python 使用前提:需要解压 资源全名:cfl_common-5.26.10-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
ActivePerl-5.26.3.0000-MSWin32-x64-f7fd6fde.exe
ActivePerl-5.26
Perl在windows下的安装包,最近发现Perl安装包下载特别麻烦,所以上传一个下载好的方便大家。
ActivePerl 是一款用来执行Perl程序的脚本解释器。 Windows 环境下的 PERL 语言解释器的源代码。支持 Microsoft IIS,包含了包括有 Perl for Win32、Perl for ISAPI、PerlScript、Perl Package Manager四套开发工具...
论文生成diff版本时需要用到latexdiff,latexdiff的成功运行需要安装和配置perl
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
一个perl脚本解释器,,windows 64位 Vuforia开发AR3D模型更换使用
该资源从官方网站下载https://www.activestate.com/products/activeperl/downloads/,下载日期2019-3-18 10:29:48,仅用于学习配置使用mysqldumpslow来查询mysql慢日志,有需要最新资源的可去官方网站下载,该资源...