黑馬程序員---Java泛型

                                                 關於Java中的泛型
                 --------- android培訓java培訓、java學習型技術博客、期待與您交流! ------------

1.什麼是泛型
泛型是一種安全機制。程序的安全問題,由原來的運行時期,提到了編譯時期
使用泛型的好處:避免了數據類型的強制轉換

 
//==================================================
2.如何使用泛型
泛型的格式:  集合類<數據類型>  變量 = new 集合類<數據類型>();
指示這個集合,只能存儲已經定義的數據類型
/*
 * 泛型的安全性
 */
import java.util.*;
public class GenericDemo {
 public static void main(String[] args) {
  ArrayList<String> array = new ArrayList<String>();
  array.add("afe");
  array.add("btefd");
  array.add("qewd");
  array.add("befv");
 
  //迭代的過程中,輸出每一個字符串的長度
  //存儲的數據類型,不是String,導致出現類型轉換異常,異常發生在運行時期的
  Iterator<String>it = array.iterator();
  while(it.hasNext()){
   String s = it.next();
   System.out.println(s.length());
  }
 }
}

//==================================================
3.自定義泛型
利用泛型,提高程序的安全性,不可以隨便傳遞參數
/*
 * 自定義的泛型
 * 寫一個工廠,創建對象
 */
class Student{}
class Worker{}
//爲了解決運行時期的安全性問題,對這個工廠類,進行泛型的定義
// new Factory<Student>
class Factory<T>{
 private T t;
 public void setQ(T t){
  this.t = t;
 }
 public QQ getQ(){
  return t;
 }
}
public class GenericDemo1 {
 public static void main(String[] args) {
   Factory<Student> f = new Factory<Student>();
   f.setQ(new Student());
   Student s = f.getQ();
   System.out.println(s);
 }
}
//==================================================
4.泛型的類,泛型的方法
  泛型類,在定義類的時候,在類的右邊寫<變量>
  泛型方法,是在方法的聲明上寫<變量>
/*
 * 泛型類和泛型方法
 */
//xt變量,建立對象的時候,傳遞什麼,變量就變成什麼數據類型
class Generic<xt>{
 public void print(xt s){
  System.out.println(s);
 }
 
 //在方法的定義上寫泛型,此時這個方法,不受類上泛型的約束
 public <QQ> void show(QQ q){
  System.out.println(q);
 }
 
 //靜態方法中,定義泛型,泛型寫在static後面
 public static<T> void method(T t){
  System.out.println(t);
 }
}
public class GenericDemo2 {
 public static void main(String[] args) {
  Generic<Integer> g = new Generic<Integer>();
  g.print(124);
  g.show(12.34);
  Generic.method(false);
 
 }
}

//==================================================
5.泛型接口
  在接口上定義泛型
  接口是需要類實現
    類實現接口,不指定泛型,由創建實現類的同時指定類型
    類實現接口,直接指定泛型
/*
 * 泛型接口
 */
interface MyInter<T>{
 public abstract void show(T t);
}
//定義實現類,實現的時候,不指定泛型,由創建對象的時候,指定泛型
class MyIntertImpl<T> implements MyInter<T>{
 public void show(T t){
  System.out.println(t);
 }
}
//定義實現類,直接指定泛型
class MuMyIntertImpl2 implements MyInter<Integer>{
 public void show(Integer t){
  System.out.println(t);
 }
}
public class GenericDemo3 {
 public static void main(String[] args) {
  MyIntertImpl<String> my = new MyIntertImpl<String>();
  my.show("abc");
 
  MuMyIntertImpl2 my2 = new MuMyIntertImpl2();
  my2.show(123);
 }
}
//==================================================
6.泛型的通配符
  泛型的通配符<?>表示不清楚泛型是什麼數據類型
  如果只簡單的做遍歷迭代是可以的,提高安全性,避免強制轉換不可以了

import java.util.*;
public class GenericDemo4 {
 public static void main(String[] args) {
  ArrayList<String> array = new ArrayList<String>();
  array.add("abc1");
  array.add("abc2");
  array.add("abc3");
  method(array);
  HashSet<Integer> hs = new HashSet<Integer>();
  hs.add(1231);
  hs.add(1232);
  hs.add(1233);
  hs.add(1234);
  method(hs);
 
  //迭代器迭起兩個集合
  //將迭代器提取成一個方法,當你需要的時候,直接調用方法
 }
 private static void method(Collection<?> coll){
    Iterator<?> it = coll.iterator();
    while(it.hasNext()){
     System.out.println(it.next());
    }
 }
}
//==================================================
7.泛型的限定

泛型限定的格式<?    XXX  Xx>, 泛型限定的使用,必須有繼承和多態

泛型的上限格式:<? extends E> 傳遞E類型,和E的子類類型。泛型的上限(限制的是最高父類)

泛型的下限格式:<? super T>傳遞T類型,和T的父類類型,泛型的下限(限制最低的子類。
泛型接受本類類型,接受父類類型


//==================================================
自定義泛型案例:
public class GenericPerson implements Comparable<GenericPerson>{
 private String name;
 private int age;
 
 public int compareTo(GenericPerson p){
  int num = this.name.compareTo(p.name);
  return num == 0 ? this.age - p.age : num ;
 }
 
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
 public GenericPerson(String name, int age) {
  this.name = name;
  this.age = age;
 }
 
}


///=====
/*
 * HashSet 集合存儲自定義對象Person,加上泛型
 */
import java.util.*;
public class HashSetDemo {
 public static void main(String[] args) {
 // HashSet<Person> hs = new HashSet<Person>();
  TreeSet<GenericPerson> hs = new TreeSet<GenericPerson>(new MyComparator());
  hs.add(new GenericPerson("haha",101));
  hs.add(new GenericPerson("haha",10));
  hs.add(new GenericPerson("xixi",10));
  hs.add(new GenericPerson("haha",10));
  hs.add(new GenericPerson("hehe",10));
 
  Iterator<GenericPerson> it = hs.iterator();
  while(it.hasNext()){
   GenericPerson p = it.next();
   System.out.println(p.getName() +"..." + p.getAge());
  }
 }
}
class MyComparator implements Comparator<GenericPerson>{
 public int compare(GenericPerson p1, GenericPerson p2){
  int num = p1.getAge() - p2.getAge();
  return num == 0 ? p1.getName().compareTo(p2.getName()) : num;
 }
 
}

                        --------- android培訓java培訓、java學習型技術博客、期待與您交流! ------------
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章