泛型
来源:互联网 发布:java通用版uc浏览下载 编辑:程序博客网 时间:2024/05/29 10:09
概念:
jdk 1.5出现的安全机制。
好处:
1,将运行时期的问题ClassCastException转到了编译时期。
2,避免了强制转换的麻烦。
<>:
当操作引用数据类型不确定的时候,使用泛型,将要操作的引用数据类型传入即可
其实<>就是一个用于接收具体引用数据类型的参数范围。
在程序中只要用到了带有<>的类或者接口,就要明确传入具体的应用数据类型。
泛型的原理:
方形技术是给编译器使用的技术,用于编译时期,确保了类型的安全。
运行时会将泛型去掉,生成的class问件是不带泛型的,这个称为泛型的擦除。
为什么擦除?因为为了兼容运行时的类加载器。
泛型的补偿:
运行时,通过获取元素的类型进行转换动作,不用使用者再强制类型转换了,
代码演示:
定义一个人的类,包含人的年龄和姓名。
public class Person implements Comparable<Person> { private int age; private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Person(int age, String name) { super(); this.age = age; this.name = name; } public Person() { super(); } @Override public int compareTo(Person p) { int flag = this.age-p.age; return flag==0?this.name.compareTo(p.name):flag; }}
根据名字排序的比较器
public class CompareByName implements Comparator<Person> { @Override public int compare(Person o1, Person o2) { int flag=o1.getName().compareTo(o2.getName()); return flag==0?o1.getAge()-o2.getAge():flag; }}
测试类
public class FanXingDemo { public static void main(String[] args){ TreeSet<Person> ts=new TreeSet<Person>(new CompareByName()); ts.add(new Person(18,"xiaoming")); ts.add(new Person(20,"xiaoBai")); ts.add(new Person(17,"xiaohong")); ts.add(new Person(12,"xiaohai")); Iterator<Person> it= ts.iterator(); while(it.hasNext()){ Person p=it.next(); System.out.println(p.getAge()+"+++"+p.getName()); } }}
泛型类
在JDK 1.5后,使用泛型类来接收类中要操作的引用数据类型。
当类中的操作的引用数据类型不确定时,就使用泛型类来表示。
代码演示
定义一个Tool类
public class Tool<Element>{ private Element element; public Element getElement() { return element; } public void setElement(Element element) { this.element = element; } //将泛型定义在方法上,该方法不在受类泛型的约束。 public <Y>void print(Y y){ System.out.println(y.toString()); } //当方法静态时,不能访问类上定义的泛型,如果静态 //方法使用泛型,只能将泛型定义在方法上。 public static <H>void show(H h){ System.out.println(h.toString()); }}
测试类:
public class FanXingDemo { public static void main(String[] args){ Tool<Student> tool=new Tool<Student>(); tool.setElement(new Student()); Student stu=tool.getElement(); tool.print("xiaoming"); //调用泛型中静态类的方法 Tool.show(123); }}
泛型接口
代码演示:
interface inter<T>{ public void fun(T t);}class InterDemo1<Q> implements inter<Q>{ @Override public void fun(Q t) { System.out.println(t); }}class InterDemo implements inter<String>{ @Override public void fun(String str) { System.out.println(str); }}
测试类
public class FanXingDemo { public static void main(String[] args){ InterDemo i=new InterDemo(); i.fun("xiaohong "); InterDemo1 inter1=new InterDemo1(); inter1.fun(new Integer(6)); }}
泛型的高级应用
当传入的集合类型不确定,并且集合中的元素也不确定时,可以采用将集合向上转型和使用通配符来解决。
代码演示:
迭代并打印集合中的元素
public void print(Collection<?> al) { Iterator<?> it=al.iterator(); while(it.hasNext()){ System.out.println(it.next()); } }
测试:
public static void main(String[] args){ TreeSet<Integer> al=new TreeSet<Integer>(); al.add(123); al.add(456); ArrayList<String> al2=new ArrayList<String>(); al2.add("ccc"); al2.add("ddd"); print(al); print(al2); }
也可以将泛型定义在方法上:
public static <T>void print(Collection<T> al) { Iterator<T> it=al.iterator(); while(it.hasNext()){ System.out.println(it.next()); } }
泛型的限定:
上限:? extends E :接收E类型或者E的子类型对象。
public static void print(Collection<? extends Person> al) { Iterator<? extends Person> it=al.iterator(); while(it.hasNext()){ System.out.println(it.next()); } }
下限:? extends E:接收E类型或者E的父类型。
一般在存储元素的时候使用上限,因为取出都是照上限类型来运算的,不会出现类型安全隐患。
阅读全文
0 0
- 泛型
- 泛型
- 泛型
- 泛型
- 泛型
- 泛型
- 泛型
- 泛型
- 泛型
- 泛型
- 泛型
- 泛型
- 泛型
- 泛型
- 泛型
- 泛型
- 泛型
- 泛型
- goto的替换
- 一个shell脚本实现linux集群所有机器免密钥登录
- kafka+storm整合代码
- MPAndroidChart直方图、多组(可滑动、渐变可以看博主前面讲直方图的博客)
- 日常笔记(不定时更新)
- 泛型
- studio得到系统时间
- 关于如何将Module修改为LIbrary,以及在主项目中跳转到Library的activity遇到的坑
- 基于qt,opencv交互式的graphcuts算法的实现
- 在linux上安装redis
- 插入排序 @ Python
- 图像处理实例--Retinex增强处理
- 自定义Gradle插件
- 2017 Multi-University Training Contest