Java Generic application

最是人间留不住,朱颜辞镜花辞树。这篇文章主要讲述Java Generic application相关的知识,希望能为你提供帮助。
【Java Generic application】三、泛型概述和基本使用
* A:泛型概述
* 泛型的由来:通过Object转型问题引入
* 早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以java提供了泛型来解决这个安全问题。

1 /*Person类 父类*/ 2 public class Person { 3private String name; 4private int age; 5public Person() { 6super(); 7 8} 9public Person(String name, int age) { 10super(); 11this.name = name; 12this.age = age; 13} 14public String getName() { 15return name; 16} 17public void setName(String name) { 18this.name = name; 19} 20public int getAge() { 21return age; 22} 23public void setAge(int age) { 24this.age = age; 25} 26 27 } 28 29 /*Student 类继承Person类*/ 30 public class Student extends Person { 31 32public Student() { 33} 34 35public Student(String name, int age) { 36super(name, age); 37 38} 39 40 } 41 /*Tool class*/ 42 43 public class Tool{ 44private Objectq; 45 46public Object getObj() { 47return q; 48} 49 50public void setObj( ) { 51this.q = q; 52} 53 54 55 } 56 57 /*Work class extends Person*/ 58 public class Worker extends Person { 59 60public Worker() { 61} 62 63public Worker(String name, int age) { 64super(name, age); 65 66} 67 68 } 69 70 71 /*invoke class*/ 72 public static void demo1() { 73Toolt = new Tool (); //创建工具类对象 74t.setObj(new Student("张三",23)); 75 76//Worker w = (Worker) t.getObj(); //向下转型,但是 77//Object是超类无法转型 78//System.out.println(w); 79} 80 81 /** 82上方会报错,因为传入是Student类型但是接受的是Work类型,导致类型不一致 83 解决办法是用泛型指定Tool是Student类,这样就可以实现强转 84 */

解决方法:
public static void demo1() { Tool< Student> t = new Tool< > (); //创建工具类对象 t.setObj(new Student("张三",23)); //Worker w = (Worker) t.getObj(); //向下转型 //System.out.println(w); }/*improve Tool class*/ public class Tool< Q> { private Q q; public Q getObj() { return q; }public void setObj(Q q) { this.q = q; } }

扫盲点:
Java Generic application

文章图片
Java Generic application

文章图片
public class Tool< Q> { private Q q; public Q getObj() { return q; }public void setObj(Q q) { this.q = q; }public< T> void show(T t) {//方法泛型最好与类的泛型一致 System.out.println(t); //如果不一致,需要在方法上声明该泛型 }public static< W> void print(W w) {//静态方法必须声明自己的泛型 System.out.println(w); }

View Code在接口中实现泛型
Java Generic application

文章图片
Java Generic application

文章图片
interface Inter< T> { public void show(T t); }/*class Demo implements Inter< String> {//推荐用这种@Override public void show(String t) { System.out.println(t); }}*/class Demo< T> implements Inter< T> {//没有必要在实现接口的时候给自己类加泛型@Override public void show(T t) { System.out.println(t); }}

View Code 
  泛型中高级通配符的运用
/**
* * A:泛型通配符< ?>
* 任意类型,如果没有明确,那么就是Object以及任意的Java类了
* B:? extends E       
* 向下限定,E及其子类
* C:? super E
* 向上限定,E及其父类
*/
B:
Java Generic application

文章图片
Java Generic application

文章图片
1 public static void main(String[] args) { 2//List< ?> list = new ArrayList< Integer> (); //当右边的泛型是不确定时,左边可以指定为? 3ArrayList< Person> list1 = new ArrayList< > (); 4list1.add(new Person("张三", 23)); 5list1.add(new Person("李四", 24)); 6list1.add(new Person("王五", 25)); 7 8ArrayList< Student> list2 = new ArrayList< > (); 9list2.add(new Student("赵六", 26)); 10list2.add(new Student("周七", 27)); 11 12list1.addAll(list2); 13System.out.println(list1); 14 15}

View CodeC:
Java Generic application

文章图片
Java Generic application

文章图片
1 public static void main(String[] args) { 2//demo1(); 3TreeSet< Student> ts1 = new TreeSet< > (new CompareByAge()); 4ts1.add(new Student("张三", 33)); 5ts1.add(new Student("李四", 13)); 6ts1.add(new Student("王五", 23)); 7ts1.add(new Student("赵六", 43)); 8 9TreeSet< BaseStudent> ts2 = new TreeSet< > (new CompareByAge()); 10ts2.add(new BaseStudent("张三", 33)); 11ts2.add(new BaseStudent("李四", 13)); 12ts2.add(new BaseStudent("王五", 23)); 13ts2.add(new BaseStudent("赵六", 43)); 14 15System.out.println(ts2); 16} 17 18 //public static void demo1() { 19 //ArrayList< Student> list1 = new ArrayList< > (); 20 //list1.add(new Student("张三", 23)); 21 //list1.add(new Student("李四", 24)); 22 // 23 //ArrayList< BaseStudent> list2 = new ArrayList< > (); 24 //list2.add(new BaseStudent("王五", 25)); 25 //list2.add(new BaseStudent("赵六", 26)); 26 // 27 //list1.addAll(list2); 28 //} 29 30 31 32 33 class CompareByAge implements Comparator< Student> { 34 35@Override 36public int compare(Student s1, Student s2) { 37int num = s1.getAge() - s2.getAge(); 38return num == 0 ? s1.getName().compareTo(s2.getName()) :num; 39} 40 41 }

View CodeB,C 原理解释图
Java Generic application

文章图片

 
Java Generic application

文章图片

 
* B:泛型好处
* 提高安全性(将运行期的错误转换到编译期) 
* 省去强转的麻烦
* C:泛型基本使用
* < > 中放的必须是引用数据类型 
* D:泛型使用注意事项
* 前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型)

 

    推荐阅读