---------------------- android培训、java培训、期待与您交流! ----------------------
泛型
泛型:
JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。
好处
1.将运行时期出现问题ClassCastException,转移到了编译时期。,
方便于程序员解决问题。让运行时问题减少,安全。,
2,避免了强制转换麻烦。
泛型格式:通过<>来定义要操作的引用数据类型。
在使用java提供的对象时,什么时候写泛型呢?
通常在集合框架中很常见,
只要见到<>就要定义泛型。
其实<> 就是用来接收类型的。
当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
import java.util.*; class GenericDemo { public static void main(String[] args) { //使用泛型进行限定元素类型 ArrayList<String> al = new ArrayList<String>(); al.add("abc01");//被限定以后,只能添加与限定类型相同类型的元素 al.add("abc0991"); al.add("abc014"); //al.add(4); ////al.add(new Integer(4));//如果添加的元素类型不正确会编译失败 Iterator<String> it = al.iterator(); while(it.hasNext()) { String s = it.next(); System.out.println(s+":"+s.length()); } } }
//在使用接口是时候指定类型 class LenComparator implements Comparator<String> { //在接口上指定以后,内部使用的都是相同的类型 public int compare(String o1,String o2) { int num = new Integer(o2.length()).compareTo(new Integer(o1.length())); if(num==0) return o2.compareTo(o1); return num; } }
泛型类。
什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候,
早期定义Object来完成扩展。
现在定义泛型来完成扩展。
//泛型前做法。 class Tool { private Object obj; public void setObject(Object obj) { this.obj = obj; } public Object getObject() { return obj; } } //在有了泛型以后,将泛型定义到类上 class Utils<QQ> { private QQ q; public void setObject(QQ q)//类中的方法可以使用泛型进行定义 { this.q = q; } public QQ getObject() { return q; } } class GenericDemo3 { public static void main(String[] args) { //在创建该类对象的时候指定类型 Utils<Worker> u = new Utils<Worker>(); u.setObject(new Student()); Worker w = u.getObject(); /*按照以前的做法,要处理任意类型的时候,使用到某个类型特有的 方法,需要进行强转。 Tool t = new Tool(); t.setObject(new Student()); Worker w = (Worker)t.getObject(); */ } }
泛型类定义的泛型,在整个类中有效。如果被方法使用,
那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。
为了让不同方法可以操作不同类型,而且类型还不确定。
那么可以将泛型定义在方法上。
特殊之处:
静态方法不可以访问类上定义的泛型。
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
//泛型定义到类上 class Demo<T> { public void show(T t) { System.out.println("show:"+t); } public void print(T t) { System.out.println("show:"+t); } } class Demo<T> { //泛型定义到方法上,使用本类的泛型进行定义 public void show(T t) { System.out.println("show:"+t); } //将泛型定义到方法上,可以使用与本类不同的泛型定义 public <Q> void print(Q q) { System.out.println("print:"+q); } //静态方法不能使用类上定义的泛型,静态方法必须把泛型定义到方法上。 public static <W> void method(W t) { System.out.println("method:"+t); } } class GenericDemo4 { public static void main(String[] args) { Demo <String> d = new Demo<String>(); d.show("haha"); //d.show(4);//使用与泛型类不同类型的参数传递给泛型方法会编译失败 d.print(5); d.print("hehe"); Demo.method("hahahahha"); } }
//泛型定义在接口上。 interface Inter<T> { void show(T t); } //在使用接口时指定泛型 class InterImpl implements Inter<String> { public void show(String t) { System.out.println("show :"+t); } } //在实现一个接口的时候没有指定泛型类型,并把这个类定义为泛型类 class InterImpl<T> implements Inter<T> { public void show(T t) { System.out.println("show :"+t); } } class GenericDemo5 { public static void main(String[] args) { //在创建这个类的对象的时候进行指定类型 InterImpl<Integer> i = new InterImpl<Integer>(); i.show(4); //InterImpl i = new InterImpl(); //i.show("haha"); } }
? 通配符。也可以理解为占位符。
泛型的限定;
? extends E: 可以接收E类型或者E的子类型。上限。
? super E: 可以接收E类型或者E的父类型。下限
import java.util.*; class GenericDemo6 { public static void main(String[] args) { ArrayList<Person> al = new ArrayList<Person>(); al.add(new Person("abc1")); al.add(new Person("abc2")); al.add(new Person("abc3")); //printColl(al); ArrayList<Student> al1 = new ArrayList<Student>(); al1.add(new Student("abc--1")); al1.add(new Student("abc--2")); al1.add(new Student("abc--3")); printColl(al1); } //使用泛型限定方式,参数意为任意继承自Person的类型 public static void printColl(Collection<? extends Person> al) { Iterator<? extends Person> it = al.iterator(); while(it.hasNext()) { System.out.println(it.next().getName()); } } public static void printColl(ArrayList<?> al)//ArrayList al = new ArrayList<Integer>();error { Iterator<?> it = al.iterator(); while(it.hasNext()) { System.out.println(it.next().toString()); } } } class Person { private String name; Person(String name) { this.name = name; } public String getName() { return name; } } //写一个类继承Person类 class Student extends Person { Student(String name) { super(name); } }
---------------------- android培训、java培训、期待与您交流! ----------------------
相关推荐
NULL 博文链接:https://840198532-qq-com.iteye.com/blog/1490705
day02_Collection、泛型 day03_List、Set、数据结构、Collections day04_Map,斗地主案例 day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda表达式 day08_File类、递归 day09_字节流、字符流...
NULL 博文链接:https://840198532-qq-com.iteye.com/blog/1491352
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是...
JAVA设计模式--程序设计--反射--注解--泛型
java --泛型编程 课件 同时可结合《java 程序员教程》这本书
个人制作且上课使用的课件,希望对大家初步了解泛型相关内容有一定的帮助。个人制作且上课使用的课件,希望对大家初步了解泛型相关内容有一定的帮助。
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是...
14-泛型
03-Java集合-泛型面试题(24题)-新增
java基础-泛型通配符
GP-泛型算法通用原则
后端研究-泛型机制在Apla-Java程序生成系统中实现的方法研究.pdf
Java 基础(4_8) - 泛型机制详解
SSH笔记-泛型依赖注入,当继承类完毕之后,根据泛型依赖注入的特性,被继承类会参照继承类所引用了的其他的引用关系自动建立对应引用关系,这就是泛型依赖注入
C++Primer第11章-泛型算法-课后习题答案[收集].pdf
包含代码,实验案例,课件(泛型的基本概念、泛型的定义和类型参数、泛型类和泛型接口,泛型委托和泛型事件)
C语言在泛型这一块确实不行,哈,但我就是喜欢泛型啊。 用宏定义做的C语言泛型,提供一个思路给大家。
本程序利用c语言来实现c++中STL的功能,也就是利用C语言来实现泛型的数据结构,这个文件中只包含四种数据结构,stack,queue,list,vector
SSH2_自动生成数据库框架整合-泛型引用 数据库是用的是mysql 里面有一个错误 我就先不提示 看看大家能否发现是什么错误,数据库表是不需要建立的 当服务器开启的时候就开始创建表