泛型的通配符问题
2016-06-06 00:00
239 查看
摘要: 泛型是把类型作为一种参数来指定,使用泛型之后类型就不是一成不变的了 ,而是通过参数来进行设定。泛型可以是系统JAVA中的 类 ,也可以是自己创建的类, 另外还有泛型通配符,无限定的通配符? 或者是 上限通配符 ?extends T , 或者是 下限通配符 ?super T 。 上限代表最高继承与T 类型 ,下限代表最低是T类型 或是T的 父类 。以下 介绍几种泛型的使用例子。
泛型是把类型作为一种参数来指定,使用泛型之后类型就不是一成不变的了 ,而是通过参数来进行设定。泛型可以是系统JAVA中的 类 ,也可以是自己创建的类, 另外还有泛型通配符,无限定的通配符? 或者是 上限通配符 ?extends T , 或者是 下限通配符 ?super T 。 上限代表最高继承与T 类型 ,下限代表最低是T类型 或是T的 父类 。以下 介绍几种泛型的使用例子。
`
泛型是把类型作为一种参数来指定,使用泛型之后类型就不是一成不变的了 ,而是通过参数来进行设定。泛型可以是系统JAVA中的 类 ,也可以是自己创建的类, 另外还有泛型通配符,无限定的通配符? 或者是 上限通配符 ?extends T , 或者是 下限通配符 ?super T 。 上限代表最高继承与T 类型 ,下限代表最低是T类型 或是T的 父类 。以下 介绍几种泛型的使用例子。
`
import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.List; //泛型的通配符问题 public class Ex_21 { // 演示1:泛型参数不会主动考虑继承关系 public void test() { List<B> listB = new ArrayList<B>(); List<C> listC = new ArrayList<C>(); List<A> listA = new ArrayList<A>(); // 遍历输出B print_1(listB); print_1(listA); print_1(listC); // print_2(listB); // print_2(listA); // print_2(listC); } //输出 public void print_1(Collection<?> c) { for (Object obj : c) { System.out.println(obj); } } //输出方法 public void print_2(Collection<Object> c){ for(Object obj: c){ System.out.println(obj); } } /* * 总结 :明显 第二种会报错, Object 其父类 但是 泛型 不会主动考虑继承关系 * */ //演示2: 通配符 上界 public void test2(){ List<? extends A> listA = new ArrayList<A>(); // listA.add(new A()); //假如想加入 A的类型 和A的子类怎么办? //如下处理就可以 List<A> list = new ArrayList<A>(); list.add(new A()); list.add(new B()); list.add(new C()); //无法使用 带有泛型通配符的引用调用 泛型的方法 } //演示3: 自定义泛型方法 这个比较常用 泛型方法 可以接受 不同类型参数 实现相同功能 ; public static <T>T getLast(T[] a){ return a[a.length-1] ; } public void test3(){ String [] str = {"100","200","300"}; Integer [] in = {400,500,600}; Ex_21.<String> getLast(str); Ex_21.<Integer> getLast(in); } //演示4: 实现指定类型 ,容器类型 public void test4(){ M_value <Integer> m = new M_value<Integer>(); m.setValue(100); Integer i = m.getValue(); System.out.println(i); } //该类封装了数据, 数据 继承了Number 并且实现了Serialziable 和 Comparable 接口 class M_value <M extends Number & Serializable & Comparable>{ private M value; public M getValue(){ return value; } public void setValue(M value){ this.value = value; } }`
相关文章推荐
- 华丽成长为IT高富帅、IT白富美(十一)
- 最近研究RabbitMQ的一些心得
- Redis与Memcached的区别
- Objective-C ---UIImageView (梳理整理)
- 跟我学《JavaScript高程3》 第二讲,课程笔记
- Ubuntu安装Hadoop
- ubuntu安装HBase
- FDFS和HDFS分布式文件系统测试
- 【学习日记】第五天-被动信息收集:NSLOOKUP
- 近期项目笔记整理
- 堡垒机-麒麟开源堡垒机工作原理
- 堡垒机-麒麟开源堡垒机审计命令识别技术
- 库位分布看板(库位管理)
- 夏日汽车那些汽车零部件容易出故障 夏日汽车保养方法大全
- poj3323翻译
- Android中AsyncTask的简单用法
- 数据持久化之NSUserDefaults
- 怎么让DIV居中
- EJB
- MySql修改密码后PhpAdmin无法登陆