泛型:jdk1.5后的新特性,用于解决安全问题,是一个安全机制。
好处: 1.将运行时的异常出现问题classcastException。转移到了编译时期。方便程序员调试解决问题,让运行事情问题减少,安全。 2.避免了强制转换 泛型格式:通过<>来定义要操作的引用数据类型。 在使用Java中,什么时候使用泛型呢? 通常在集合框架中很常见,只要见到<>就要定义泛型,其实<>就是用来接收类型的。 当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。 如同函数传参数一样。 Comparator<>是一个接口,也可以带泛型,表示指定类型。 //泛型类 什么时候定义泛型类呢? 当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展。现在定义泛型来完成扩展。class Utils{ private QQ q; public void setObject(QQ q){ this.q=q; } public QQ getObject(){ return q; } } class Tool{ private Object obj; public void setObject(Object obj){ this.obj=obj; } public Object getObject(){ return obj; } } class GenericDemo3{ public static void main(String [] args){ Utilsu=new Utils(); u.setObject(new Worker()); Worker w=(Worker) u.getObject(); /*Tool t=new Tool(); t.setObject(new getWorker()); Worker w=(Worker)t.getObject(); */ } }/* 特 */ 泛型方法:
class Demo{//操作对象一建立,对象就固定,这是泛型一个局限性。 public void show(T t){ System.out.println("show:"+t); } public void print(T t){ System.out.println("print"+t); } }泛型类定义的泛型,在整个类中有效,如果被方法使用。那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已结固定了。
class Demo{ publicvoid show(T t){ System.out.println("show:"+t); } publicvoid print(Q q){ //指定任意类型 System.out.println("print"+q); } public staticvoid method(W t){//静态方法泛型,是在static方法 System.out.println("method:"+t); } } class GenericDemo4{ public static void main(String [] args){ /*Demod=new Demo(); d.show(new Integer(4)); d.print(9)*/ /*Demo d=new Demo(); d.show("haha"); d.show("new Integer(4)");*/ Demod=new Demo(); d.show(4); d.print(5); d.print("lishi"); Demo.method("hahaha"); } }泛型定义在接口上。
interface Inter{ void show(T t); } //这个是指定String类型的。 class InterImp1 implements Inter{ public void show(String t){ System.out.println("show:"+t); } } //这个是让操作者自己去指定类型的 class GenericDemo5{ public static void main(String[] args){ InterImp1=new InterImp1(); i.show(4); } } class GenericDemo5(){ public static void main(){ InterImp1 i=new InterImp1(); i.show("haha"); } }? 通配符,也可以理解为占位符 泛型的限定:(高级应用) ?extend E:可以接收E类型或者E的子类,上限 ? super E:可以接收E类型或E的父类型。下限
class GenericDemo6{ public static void main(String [] args){ ArrayListal=new ArrayList(); a1.add("abc1"); a1.add("abc2"); a1.add("abc3"); ArrayListal=new ArrayList(); a1.add(new Person("abc1")); a1.add(new Person("abc2")); a1.add(new Person("abc3")); /* ArrayListall=new ArrayList(); all.add(4); all.add(7); all.add(1); printColl(all);*/ //泛型限定 ArrayListall=new ArrayList(); all.add(new Student("abc--1")); all.add(new Student("abc--2")); all.add(new Student("abc3--")); print(all); } public static void printColl(ArrayList){ //? extends Person表示泛型限定。只能是继承person类及person本身的类。 Iterator it=al.iterator(); while(it.hasNext()){ System.out.println(it.next().getName()); }
} /* public static void printColl(ArrayList al){//当类型不知道时,我们可以用通配符?来表示 Iterator it=al.iterator(); while(it.hasNext()){ System.out.println(it.next());//这里不能调用getlength().因为这是具体类中的方法,不能使用类型具体方法。但是可以使用toString() } }*/ }泛型什么用呢? 答:指定具体类型,用<>,凡是<>里面的都能打印。但是只能某一个, 如果用通配符?表示能接收所有的类型
import java.util.*; class GenericDemo7 { public static void main(String[] args) { TreeSetts = new TreeSet(new Comp()); ts.add(new Student("abc03")); ts.add(new Student("abc02")); ts.add(new Student("abc06")); ts.add(new Student("abc01")); Iteratorit = ts.iterator(); while(it.hasNext()) { System.out.println(it.next().getName()); } /**/ TreeSetts1 = new TreeSet(new Comp()); ts1.add(new Worker("wabc--03")); ts1.add(new Worker("wabc--02")); ts1.add(new Worker("wabc--06")); ts1.add(new Worker("wabc--01")); Iteratorit1 = ts1.iterator(); while(it1.hasNext()) { System.out.println(it1.next().getName()); } } } /* class StuComp implements Comparator{ public int compare(Student s1,Student s2) { return s1.getName().compareTo(s2.getName()); } } class WorkerComp implements Comparator{ public int compare(Worker s1,Worker s2) { return s1.getName().compareTo(s2.getName()); } } */ class Comp implements Comparator//比较器。 { public int compare(Person p1,Person p2) { return p2.getName().compareTo(p1.getName());//里面只能用父类的方法。 } } class Person { private String name; Person(String name) { this.name = name; } public String getName() { return name; } public String toString() { return "person :"+name; } } class Student extends Person { Student(String name) { super(name); } } class Worker extends Person { Worker(String name) { super(name); } }