----------------------android培训、java培训、java学习型技术博客、期待与您交流!----------------------
泛型是jdk1.5的一个新特性,用于解决安全问题,是一个类型安全机制,泛型的好处在于可以将运行时出现的问题转移到了编译时期,让运行时期问题减少,而且避免了强制转换。
下面的这段代码编译不会报错,但是第5行在运行时却会java.lang.ClassCastException的错误,是因为存进去的是一个字符串类型的,而取出的时候却把它当成了一个int类型。
ArrayList<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
int i = list.get(0); //编译器会报错
在集合上运用泛型之后就不会出现这样的运行时错误,泛型限定了往集合中添加元素时的类型,如下代码:
ArrayList<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
int i = list.get(0); //编译器会报错
以上代码指定了只能往集合中添加String类型的元素,当然取出来时也只会是String类型的元素,如果试图把元素强制转换成其他类型(此处是int类型),编译器就会报错。
在泛型中,参数化类型不考虑类型参数的继承关系,如下:
ArrayList<String> list1 = new ArrayList<Object>(); //编译错误
ArrayList<Object> list2 = new ArrayList<String>(); //编译错误
自定义泛型方法:
class Demo {
public <T> void show(T t) {
System.out.println(t);
}
}
调用以上方法时,传递给参数t的是什么类型,打印就是什么类型,避免了写多个重载方法以打印不同类型的值
自定义泛型类:
当类中要操作的引用数据类型不确定的时候就可以使用泛型类
class Utils<T> {
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
当实例化一个Utils泛型类时,该类中的对象类型就已经确定了,不能加入其他的类型
自定义泛型接口:
interface Inter<T> {
void show(T t);
}
泛型接口跟普通的接口定义很相似,在接口的名称后面加上一个<T>即可
实现了泛型接口的泛型类
class InterImpl<T> implements Inter<T> {
@Override
public void show(T t) {
System.out.println(t);
}
}
泛型类的类型必须与泛型接口类的类型一致
泛型的高级应用:泛型限定
有时候并不希望往集合加入任何类型的对象,这时可以使用泛型限定
限定通配符的上边界(以下的代码说明只能往Vector集合中加入Number及Number的子类):
正确:Vector<? extends Number> x = new Vector<Integer>();
错误:Vector<? extends Number> x = new Vector<String>();
限定通配符的下边界(以下的代码说明只能往Vector集合中加入Integer及Integer的父类):
正确:Vector<? super Integer> x = new Vector<Number>();
错误:Vector<? super Integer> x = new Vector<Byte>();
有时候我们需要得到参数列表的泛型类别,
有如下方法:
public static <T> void applyVector(Vector<Date> v) {}
现在我们需要得到参数列表的Date类型,这时可以通过反射的技术来获得,代码如下:
Method applyMethod = GenericTest.class.getMethod("applyVector",
Vector.class);
Type[] types = applyMethod.getGenericParameterTypes();
ParameterizedType pType = (ParameterizedType) types[0];
System.out.println(pType.getActualTypeArguments()[0]);
关于泛型:
1.只有引用类型才能作为泛型方法的实际参数
2.普通方法、构造方法和静态方法中都可以使用泛型。
3.也可以用类型变量表示异常,称为参数化的异常,可以用于方法的throws列表中,但是不能用于catch子句中。
4.在泛型中可以同时有多个类型参数,在定义它们的尖括号中用逗号分,例如:
public static <K,V> V getValue(K key) { return map.get(key);}
5.当一个变量被声明为泛型时,只能被实例变量和方法调用(还有内嵌类型),而不能被静态变量和静态方法调用。因为
静态成员是被所有参数化的类所共享的,所以静态成员不应该有类级别的类型参数。
----------------------android培训、java培训、java学习型技术博客、期待与您交流!----------------------
详情请查看:http://edu.csdn.net/heima
分享到:
相关推荐
黑马程序员 - Java基础教学 - 05 - 面向对象(1).doc
黑马程序员-java32期培训视频(基础+就业)黑马程序员-java32期培训视频(基础+就业)
day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda表达式 day08_File类、递归 day09_字节流、字符流 day10_缓冲流、转换流、序列化流、Files day11_网络编程 day12_函数式接口 day13_Stream...
黑马程序员 - Java基础教学 - 04 - 数组、进制转换、二维数组
黑马程序员 - Java基础教学 - 03 - 变量的作用域、for循环、break、continue、内存结构
黑马程序员 - Java基础教学 - 08 - 面向对象(4)-多态.doc
黑马程序员 - 毕向东 - Java基础教学 - 第02天 个人观看视频总结文档
黑马程序员 - 毕向东 - Java基础教学 - 第01天 个人观看视频总结文档
黑马程序员 - Java基础教学 - 06 - 面向对象(2) - 关于静态static的那些事.doc
黑马程序员-SpringCloud-学习笔记-03-Eureka注册中心
NULL 博文链接:https://huangminwen.iteye.com/blog/1157983
黑马程序员-SpringCloud-学习笔记01-认识微服务
黑马QT讲义,适合QT入门,使用,教程很比较基础,新手可以看看,另外视频链接在哔哩哔哩中。
黑马程序员-SpringCloud-学习笔记-02-微服务拆分及远程调用
黑马程序员--毕向东全套Java视屏,讲解的相当全面,各位如果需要,尽快下载哦! 另外如果视频链接存在打不开的问题,请留言,必定及时更新链接。
月薪过万的入门必知知识,黑马程序员入学Java精华总结
黑马程序员-梅兰商城项目实战,包含图片素材和编写源码。
C++黑马程序员-演讲比赛流程管理系统记录
Java 黑马程序员入学Java知识(精华总结)
NULL 博文链接:https://840198532-qq-com.iteye.com/blog/1490901