黑马程序员--jdk1.5的新特性:泛型(重点,集合中的泛型一定要会)

来源:互联网 发布:jdk1.8 for linux下载 编辑:程序博客网 时间:2024/06/04 18:33

----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

/*泛型:JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。好处1.将运行时期出现问题ClassCastException,转移到了编译时期。,方便于程序员解决问题。让运行时问题减少,安全。,2,避免了强制转换麻烦。泛型格式:通过<>来定义要操作的引用数据类型。在使用java提供的对象时,什么时候写泛型呢?通常在集合框架中很常见,只要见到<>就要定义泛型。其实<> 就是用来接收类型的。当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。*/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());}}}

/*Generic泛型的基本应用。泛型主要用在集合中。*/import java.util.*;class GenericDemo2 {public static void main(String[] args) {TreeSet<String> ts = new TreeSet<String>(new LenComparator());//TreeSet<E>定义了泛型类。ts.add("abcd");ts.add("cc");ts.add("cba");ts.add("aaa");ts.add("z");ts.add("hahaha");Iterator<String> it = ts.iterator();//Iterator<E> 定义了泛型类。while(it.hasNext()){String s = it.next();System.out.println(s);}}}class LenComparator implements Comparator<String>//Comparator<T>定义了泛型接口。{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  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 Worker{}class Student{}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 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("hahhha");}}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 w)//这里不能写成method(T t){System.out.println("method:"+w);}}

/*泛型定义在接口上。有两种可能,重点。*/class GenericDemo5 {public static void main(String[] args) {InterImpl i = new InterImpl();i.show("haha");InterImpl_2<Integer> i2 = new InterImpl_2<Integer>();i2.show(4);}}interface Inter<T>//泛型定义在接口上{void show(T t);}class InterImpl implements Inter<String>//实现这个接口。明确了要操作的类型。{public void show(String t){System.out.println("show :"+t);}}class InterImpl_2<T> implements Inter<T>  //实现这个接口。但不明确要操作的类型。定义泛型类。{public void show(T t){System.out.println("show :"+t);}}

/*泛型中?的作用。没有作用。占位符。以前没有泛型的时候没有写后来有了泛型就加上去了。严谨。当然也可以不写。呵呵还有T和?的区别。T是一个具体的类型。可以使用的。而?不行。还有?相当与Object。只能使用Object中有的方法。由此引出了泛型的限定。那时就可以使用特有方法了哟。。*/import java.util.*;class  GenericDemo6{public static void main(String[] args) {ArrayList<String> al = new ArrayList<String>();al.add("abc1");al.add("abc2");al.add("abc3");ArrayList<Integer> al1 = new ArrayList<Integer>();al1.add(4);al1.add(7);al1.add(1);printColl(al);printColl(al1);printColl_2(al);printColl_2(al1);}public static void printColl(ArrayList<?> al)//单纯的占位。可以不写。{Iterator<?> it = al.iterator();while(it.hasNext()){System.out.println(it.next());}}public static <T> void printColl_2(ArrayList<T> al)//这里加了一个T就是泛型类了。所以要在返回值前面加了T{Iterator<T> it = al.iterator();while(it.hasNext()){T t = it.next();//T是一个具体的类型。所以可以使用。System.out.println(t);}}}

/*泛型的限定上限。? extends E: 可以接收E类型或者E的子类型。上限。上限之后可以使用父类中的方法。? super E: 可以接收E类型或者E的父类型。下限*/import java.util.*;class  GenericDemo7{public static void main(String[] args) {ArrayList<Person> al = new ArrayList<Person>();al.add(new Person("java01"));al.add(new Person("java02"));al.add(new Person("java02"));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(al); printColl(al1); }public static void printColl(ArrayList<? extends Person> al)// 这个泛型就是限定。可以传入Person和其子类。{Iterator<? extends Person> it = al.iterator();while(it.hasNext()){Person p = it.next(); //有没有感觉有点像多态?System.out.println(p.getName());//限定之后的好处。可以使用父类中的特有数据。子类中的不能用哟。}}}class Person{private String name;Person(String name){this.name = name;}public String getName(){return name;}}class Student extends Person{Student(String name){super(name);}public void show(){System.out.println("show..");}}

/*泛型限定下限。最明显的例子就是TreeSet中的 Comparator 父类的Comparator子类也可以用。*/import java.util.*;class  GenericDemo8{public static void main(String[] args) {TreeSet<Person> ts = new TreeSet<Person>();ts.add(new Person("java.3",3));ts.add(new Person("java.1",2));ts.add(new Person("java.1",2));ts.add(new Person("java.2",1));TreeSet<Student> ts_2 = new TreeSet<Student>(new Comp());//这个比较器只要是父类的都可以用。ts_2.add(new Student("abc.4",4));ts_2.add(new Student("abc.5",6));ts_2.add(new Student("abc.5",6));ts_2.add(new Student("abc.3",5));printColl(ts);printColl(ts_2);}public static void printColl(Collection<? extends Person> al){Iterator<? extends Person> it = al.iterator();while(it.hasNext()){Person p = it.next();System.out.println(p.getName()+"....."+p.getAge());}}}class Person implements Comparable<Person>{private String name;private int age;Person(String name,int age){this.name = name;this.age = age;}public String getName(){return name;}public int getAge(){return age;}public int compareTo(Person s){int num = this.getName().compareTo(s.getName());if (num==0){return new Integer(this.getAge()).compareTo(new Integer(s.getAge()));}return num;}}class Student extends Person{Student(String name,int age){super(name,age);}}class Comp implements Comparator<Person>//定义父类的比较器。子类都是可以使用。{public int compare(Person s1,Person s2){int num = new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));if (num==0){return s1.getName().compareTo(s2.getName());}return num;}}


----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

0 0