1. 程式人生 > >java 泛型中 T 和 問號(萬用字元)的區別

java 泛型中 T 和 問號(萬用字元)的區別

型別本來有:簡單型別和複雜型別,引入泛型後把複雜型別分的更細了;

  • 現在List<Object>, List<String>是兩種不同的型別;且無繼承關係;

  • 泛型的好處如:

    開始版本

      public void write(Integer i, Integer[] ia);
      public void write(Double  d, Double[] da);
    

    泛型版本

      public <T> voidwrite(T t, T[] ta);
    

    簡便了程式碼

定義泛型

  • 1.定義在類後面

    緊跟類名後面

      public classTestClassDefine<T
    , SextendsT>{
    }

    定義泛型 T, S, 且S 繼承 T

  • 2.定義在方法裝飾符後面

    緊跟修飾符後面(public)

      public <T, S extends T> T testGenericMethodDefine(T t, S s){}
    

    定義泛型 T, S, 且S 繼承 T

例項化泛型

  • 1.例項化定義在類上的泛型

第一宣告類變數或者例項化時。例如

     List<String> list;
     list = new ArrayList<String>;

第二繼承類或者實現介面時。例如

 public class
MyList<E>extendsArrayList<E>implementsList<E> {
...}
  • 2.例項化定義方法上的泛型<br/>

當呼叫範型方法時,編譯器自動對型別引數(泛型)進行賦值,當不能成功賦值時報編譯錯誤

萬用字元(?)

上面有泛型的定義賦值;當在賦值的時候,上面一節說賦值的都是為具體型別,當賦值的型別不確定的時候,我們用萬用字元(?)代替了:

 List<?> unknownList;
  List<? extends Number> unknownNumberList;
  List<? super Integer>
unknownBaseLineIntgerList;

在Java集合框架中,對於引數值是未知型別的容器類,只能讀取其中元素,不能向其中新增元素, 因為,其型別是未知,所以編譯器無法識別新增元素的型別和容器的型別是否相容,唯一的例外是NULL