泛型類定義和泛型方法以及泛型限定
阿新 • • 發佈:2019-01-23
1、泛型類定義的泛型,在整個類中有效。如果被方法使用,那麼泛型類的物件明確要操作的具體型別後,所有要操作的型別就已經固定了。
2、為了讓不同方法可以操作不同型別,而且型別還不確定。那麼可以將泛型定義在方法上。
3、特殊之處:
靜態方法不可以訪問類上定義的泛型。
如果靜態方法操作的應用資料型別不確定,可以將泛型定義在方法上。
package tan; //定義泛型類(要操作的型別不確定) class Demo<T>{ public void show(T t){ System.out.println("show:"+t); } //方法中定義泛型 public <Q> void print(Q q){ System.out.println("pirnt:"+q); } //靜態方法中定義泛型 public static <G> void method(G g){ System.out.println("mentod:"+g); } } public class GenericDemo1 { public static void main(String[] args) { Demo<String> d=new Demo<String>(); d.show("beijing"); //d.show(6); 編譯失敗,因為show方法會隨著物件的型別,物件是什麼型別的,show方法中就只能接受什麼型別 d.print(888);//將泛型定義在方法上傳什麼型別都可以 d.print("tan"); //類名呼叫靜態方法 Demo.method("IT Dreamer"); } }
4、將泛型定義在介面上
5、? 萬用字元。也可以理解為佔位符。package tan; //將泛型定義在介面上 interface Inter<T>{ public void show(T t); } //確定操作型別 /*class InterImpl implements Inter<String>{ @Override public void show(String t) { System.out.println("show-----"+t); } }*/ //方式二:實現介面以後仍然不知操作型別時 class InterImpl<T> implements Inter<T>{ @Override public void show(T t) { System.out.println("show-----"+t); } } public class GenericDemo2 { public static void main(String[] args) { /*InterImpl impl=new InterImpl(); impl.show("Great");*/ InterImpl<Integer> i = new InterImpl<Integer>(); i.show(4); } }
6、泛型限定package tan; import java.util.*; public class GenericDemo3 { 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); } //1、不明確型別用佔位符表示 public static void printColl(ArrayList<?> al){ Iterator<?> it = al.iterator(); while(it.hasNext()) { System.out.println(it.next().toString()); } } //2、也可以用下面這種方式:如果T是一個具體型別的話,可以接收並操作具體型別 public static <T>void printColl2(ArrayList<T> al){ Iterator<T> it = al.iterator(); while(it.hasNext()) { T t=it.next(); System.out.println(t); } } }
? extends E: 可以接收E型別或者E的子型別。上限。
? super E: 可以接收E型別或者E的父型別。 下限上限示例:
package xiao; import java.util.*; public class GenericDemo3 { public static void main(String[] args) { ArrayList<Person> al = new ArrayList<Person>(); al.add(new Person("tan11")); al.add(new Person("tan13")); al.add(new Person("tan21")); ArrayList<Student> al1 = new ArrayList<Student>(); al1.add(new Student("stu01")); al1.add(new Student("stu02")); al1.add(new Student("stu03")); printColl(al); System.out.println(); printColl2(al); printColl2(al1); } // 1、只能列印父類型別 public static void printColl(ArrayList<Person> al) { Iterator<Person> it = al.iterator(); while (it.hasNext()) { System.out.println(it.next().getName()); } } // 2.既可以列印父類也可以列印子類型別 《 上限》? extends E: 可以接收E型別或者E的子型別 public static void printColl2(ArrayList<? extends Person> al) { Iterator<? extends Person> it = al.iterator(); while (it.hasNext()) { System.out.println(it.next().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); } } /* class Student implements Comparable<Person>//<? super E> { public int compareTo(Person s) { this.getName() }*/
下限示例:package zheng; import java.util.Comparator; import java.util.Iterator; import java.util.TreeSet; public class GenericDemo5 { public static void main(String[] args) { TreeSet<Student> ts = new TreeSet<Student>(new Comp()); ts.add(new Student("abc1")); ts.add(new Student("abc2")); ts.add(new Student("abc3")); Iterator<Student> it = ts.iterator(); while(it.hasNext()) { System.out.println(it.next().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); } } class Comp implements Comparator<Person>//<? super E> { public int compare(Person s1,Person s2) { //Person s1 = new Student("abc1"); return s1.getName().compareTo(s2.getName()); } }
建立通用的比較器方法package Qiang; import java.util.*; class GenericDemo4 { public static void main(String[] args) { TreeSet<Student> ts = new TreeSet<Student>(new Comp()); ts.add(new Student("abc03")); ts.add(new Student("abc02")); ts.add(new Student("abc06")); ts.add(new Student("abc01")); Iterator<Student> it = ts.iterator(); while(it.hasNext()) { System.out.println(it.next().getName()); } TreeSet<Worker> ts1 = new TreeSet<Worker>(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")); Iterator<Worker> it1 = ts1.iterator(); while(it1.hasNext()) { System.out.println(it1.next().getName()); } } } //比較器是通用的, class Comp implements Comparator<Person> { 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); } }