泛型2

一,數組類型的兼容性數組

假設Student繼承自Person,Teacher也繼承自Person,考慮一個問題優化

Person[] person = new Student[10];對象

person[0] = new Teacher(.....);繼承

這個代碼實際上在編譯時都不會出錯,但是Teacher並不繼承於Student這就產生了類型混亂。因爲其中不存在類型轉換,運行時系統不會拋出ClassCastException異常。若果指定Student[]與Teacher[]數組不和Person[]數組兼容,這個問題就不存在了,但在Java中數組倒是類型兼容的。接口

數組具備協變性,這叫作協變數組類型。若是將一個不兼容的類型插入到數組中,那麼虛擬機將拋出一個ArrayStoreException異常。這使得Person[]數組中能夠同時存放Student與Teacher兩個元素。虛擬機

二,簡單的泛型類和接口it

泛型類的聲明包含一個或多個放在尖括號內的類型參數,在類的內部,咱們能夠聲明泛型類型的域和使用泛型類型做爲參數或者返回值的方法,例如:io

public class Test<AnyType>{編譯

  public Anytype read(){ast

    return storedValue;

  }

  public void write(Anytype x){

    storedValue = x;

  }

  private AnyType storedValue;

}

能夠對Test<String>的write方法傳入一個String類型的參數,傳入其餘類型的參數將產生編譯錯誤。

也能夠聲明接口是泛型的。例如在Java 5 中Comparable接口是泛型的,這使得從前傳遞到compareTo的任何引用變量即便不合理的類型也會編譯的現象消失。

泛型類和接口使得之前只有在運行時才能發現的錯誤現在在編譯時就能發現。

菱形運算符:在實例化Test<AnyType>時須要寫Test<String> test = new Test<String>(),這樣會使實例化的代碼複雜,但咱們知道既然test是Test<String>的那麼建立的對象也必然是Test<String>類型的,在Java 7中可使用菱形運算符進行改寫Test<String> test = new Test<>();

通配符:Java中數組是協變的但泛型集合不是協變的,這會出現一種現象,及當Collection<Person>做爲參數時,若傳入Collection<Student>會產生一個編譯錯誤,泛型不是協變的體現了使用泛型的好處即會產生編譯錯誤而不是運行時報錯,但由於泛型缺少協變性,在一些代碼的編寫上會缺少靈活性,在Java 5中使用了通配符彌補了這個不足。例如使用Collection<? extends Person>替代Collection<Person>,此時傳入Collection<Student>不會報錯。

類型限界:在用泛型編寫的方法中,有時會規定傳入的參數必須擁有某些性質,例如使用compareTo()方法尋找最大值時,須要規定比較的項必須實現了Comparable接口,此時就出現了類型限界。類型限界在尖括號內指定,它指定參數類型必須具備的性質。例如public static <Anytype extends Comparable<Anytype>>固然,這句代碼還能夠進一步優化,假設Square繼承Shape,Shape實現了Comparable<Shape>接口,那麼Square也實現了Comparable<Shape>接口,但此時Square並未實現Comparable<Square>接口,因此能夠將代碼加上通配符繼續優化即public static <Anytype extends Comparable<? super Anytype>>

相關文章
相關標籤/搜索