黑马程序员_java06_泛型
2015-09-10 16:40
344 查看
——- android培训、java培训、期待与您交流! ———-
泛型也被称为参数化类型,就是在定义类,接口和方法时,规定了创建将要处理的对象类型。泛型更多地体现在集合的应用上,用于表明集合元素的类型限制。
泛型的好处:
1.将运行时期出现的问题ClassCaseException,转移到了编译时期,方便于程序员解决问题。让运行时间减少安全。
2.避免了强制转换的麻烦。
1.定义简单的泛型类
API中有大量的泛型类与泛型接口等。定义泛型只需要在声明类时在类名后使用(E可以是任何其他字母)的形式指定该类是一个泛型类,E称为类型参数,类型参数可以在该类中需要数据类型的都地方使用,如属性声明,方法声明等。在具体使用该类时,E可以使用任何一个具体类型替代。
泛型格式: 通过<>定义要操作的引用数据类型。
在使用java提供的对象时,什么时候写泛型?
通常在集合框架中很常见,只要见到<>就要定义泛型。其实<>就是用于接收类型的。当使用集合时,将集合中要储存的数据类型作为参数传递到<>中即可。
集合TreeSet中定义了泛型,TreeSet全部是String类型,若是非String类型的,无法传入。
泛型参数的限定
一个类通过泛型 参数定义,实现了处理对象的普遍性,这是优点,但是也有缺点。前面的泛型类,泛型接口及泛型方法的定义存在一个缺陷,就是由于参数的类型是未知的,只能在运行时确定下来,因此,就限制了泛型类对目标对象的处理能力。因为泛型类只能将其视为Object类型的实例进行处理,无法更有效地使用参数实力本身所能够提供的方法或者属性。通过使用参数类型的边界限定,可以有效地解决这个问题。
1.定义泛型参数的上界
通过使用extends关键字,可以限定泛型参数的类型上界,声明如下:
上面的方法规定了StudentDemo类所能处理的参数类型和Person有继承关系,这样程序中就会这种关系,将T声明的变量视为Person类型,从而利用了Person类型的特征进行工作。另外,extends 关键字所声明的上界即可以是一个类,也就是一个接口。这一点和接口的实现关键字是不同的。
2.定义泛型参数的下界
通过使用个super关键字可以固定泛型参数的类型为某种类型或者其他超类,例如:
当程序希望为一个方法的参数限定类型时,通常可以使用下限通配符。通过JDK提供数组排列方法sort()。
3.通配符
“?”符号声明参数类型可以是任何一个类型,它和参数T的含义是有区别的。T表示一个未知类型,而“?”表示任何一个类型。这种通配符一般有一下三种用法:
(1)单独的 ? ,用于表示任何类型。
(2)?extends type ,表示带有上界。
(3)?super type ,表示带有下界。
泛型也被称为参数化类型,就是在定义类,接口和方法时,规定了创建将要处理的对象类型。泛型更多地体现在集合的应用上,用于表明集合元素的类型限制。
泛型的好处:
1.将运行时期出现的问题ClassCaseException,转移到了编译时期,方便于程序员解决问题。让运行时间减少安全。
2.避免了强制转换的麻烦。
1.定义简单的泛型类
API中有大量的泛型类与泛型接口等。定义泛型只需要在声明类时在类名后使用(E可以是任何其他字母)的形式指定该类是一个泛型类,E称为类型参数,类型参数可以在该类中需要数据类型的都地方使用,如属性声明,方法声明等。在具体使用该类时,E可以使用任何一个具体类型替代。
泛型格式: 通过<>定义要操作的引用数据类型。
在使用java提供的对象时,什么时候写泛型?
通常在集合框架中很常见,只要见到<>就要定义泛型。其实<>就是用于接收类型的。当使用集合时,将集合中要储存的数据类型作为参数传递到<>中即可。
import java.util.*; class GenericDemo { public static void main(String[] args) { TreeSet<String> ts=new TreeSet<String>(); ts.add("java01"); ts.add("java02"); ts.add("java03"); ts.add("java04"); Iterator<String> it=ts.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } }
集合TreeSet中定义了泛型,TreeSet全部是String类型,若是非String类型的,无法传入。
泛型参数的限定
一个类通过泛型 参数定义,实现了处理对象的普遍性,这是优点,但是也有缺点。前面的泛型类,泛型接口及泛型方法的定义存在一个缺陷,就是由于参数的类型是未知的,只能在运行时确定下来,因此,就限制了泛型类对目标对象的处理能力。因为泛型类只能将其视为Object类型的实例进行处理,无法更有效地使用参数实力本身所能够提供的方法或者属性。通过使用参数类型的边界限定,可以有效地解决这个问题。
1.定义泛型参数的上界
通过使用extends关键字,可以限定泛型参数的类型上界,声明如下:
public class StudentDemo<T ? extends Person>
上面的方法规定了StudentDemo类所能处理的参数类型和Person有继承关系,这样程序中就会这种关系,将T声明的变量视为Person类型,从而利用了Person类型的特征进行工作。另外,extends 关键字所声明的上界即可以是一个类,也就是一个接口。这一点和接口的实现关键字是不同的。
2.定义泛型参数的下界
通过使用个super关键字可以固定泛型参数的类型为某种类型或者其他超类,例如:
List<? super Person> listP=new ArrayList<T>();
当程序希望为一个方法的参数限定类型时,通常可以使用下限通配符。通过JDK提供数组排列方法sort()。
3.通配符
“?”符号声明参数类型可以是任何一个类型,它和参数T的含义是有区别的。T表示一个未知类型,而“?”表示任何一个类型。这种通配符一般有一下三种用法:
(1)单独的 ? ,用于表示任何类型。
(2)?extends type ,表示带有上界。
(3)?super type ,表示带有下界。
import java.util.*; class GenericDemo8 { public static void main(String[] args) { ArrayList<Person> al=new ArrayList<Person>(); al.add(new Person("zhangsan1",3)); al.add(new Person("zhangsan2",3)); al.add(new Person("zhangsan3",3)); printColl(al); } public static void printColl(ArrayList <? extends Person> al) { Iterator<? extends Person> it=al.iterator(); while (it.hasNext()) { //System.out.println(it.next().getName()); //System.out.println(it.next().getAge()); Person p=it.next(); System.out.println(p.getName()+"\t"+p.getAge()); } } } class Person { private int age; private String name; Person(String name,int age) { this.name=name; this.age=age; } public void setName(String name) { this.name=name; } public String getName() { return name; } public void setAge(int age) { this.age=age; } public int getAge() { return age; } } class Student extends Person { Student(String name,int age) { super(name,age); } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories