<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. java語言

    Java泛型是什么

    時間:2025-05-03 06:48:36 java語言 我要投稿
    • 相關推薦

    Java泛型是什么

      導語:泛型,即“參數化類型”。一提到參數,最熟悉的就是定義方法時有形參,然后調用此方法時傳遞實參。那么參數化類型怎么理解呢?讓我們了解一下吧!

      顧名思義,就是將類型由原來的具體的類型參數化,類似于方法中的變量參數,此時類型也定義成參數形式(可以稱之為類型形參),然后在使用/調用時傳入具體的類型(類型實參)。

      看著好像有點復雜,首先我們看下上面那個例子采用泛型的寫法。

      1 public class GenericTest {

      2

      3   public static void main(String[] args) {

      4     /*

      5     List list = new ArrayList();

      6     list.add("qqyumidi");

      7     list.add("corn");

      8     list.add(100);

      9     */

      10

      11     Listlist = new ArrayList();

      12     list.add("qqyumidi");

      13     list.add("corn");

      14     //list.add(100);  // 1 提示編譯錯誤

      15

      16     for (int i = 0; i < list.size(); i++) {

      17       String name = list.get(i); // 2

      18       System.out.println("name:" + name);

      19     }

      20   }

      21 }

      采用泛型寫法后,在//1處想加入一個Integer類型的對象時會出現編譯錯誤,通過List,直接限定了list集合中只能含有String類型的元素,從而在//2處無須進行強制類型轉換,因為此時,集合能夠記住元素的類型信息,編譯器已經能夠確認它是String類型了。

      結合上面的泛型定義,我們知道在List中,String是類型實參,也就是說,相應的List接口中肯定含有類型形參。且get()方法的返回結果也直接是此形參類型(也就是對應的傳入的類型實參)。下面就來看看List接口的的具體定義:

      1 public interface Listextends Collection{

      2

      3   int size();

      4

      5   boolean isEmpty();

      6

      7   boolean contains(Object o);

      8

      9   Iteratoriterator();

      10

      11   Object[] toArray();

      12

      13T[] toArray(T[] a);

      14

      15   boolean add(E e);

      16

      17   boolean remove(Object o);

      18

      19   boolean containsAll(Collection

      20

      21   boolean addAll(Collection c); c); c); c);

      28

      29   void clear();

      30

      31   boolean equals(Object o);

      32

      33   int hashCode();

      34

      35   E get(int index);

      36

      37   E set(int index, E element);

      38

      39   void add(int index, E element);

      40

      41   E remove(int index);

      42

      43   int indexOf(Object o);

      44

      45   int lastIndexOf(Object o);

      46

      47   ListIteratorlistIterator();

      48

      49   ListIteratorlistIterator(int index);

      50

      51   ListsubList(int fromIndex, int toIndex);

      52 }

      我們可以看到,在List接口中采用泛型化定義之后,中的E表示類型形參,可以接收具體的類型實參,并且此接口定義中,凡是出現E的地方均表示相同的接受自外部的類型實參。

      自然的,ArrayList作為List接口的實現類,其定義形式是:

      1 public class ArrayListextends AbstractList

      2     implements List, RandomAccess, Cloneable, java.io.Serializable {

      3

      4   public boolean add(E e) {

      5     ensureCapacityInternal(size + 1); // Increments modCount!!

      6     elementData[size++] = e;

      7     return true;

      8   }

      9

      10   public E get(int index) {

      11     rangeCheck(index);

      12     checkForComodification();

      13     return ArrayList.this.elementData(offset + index);

      14   }

      15

      16   //...省略掉其他具體的定義過程

      17

      18 }

      由此,我們從源代碼角度明白了為什么//1處加入Integer類型對象編譯錯誤,且//2處get()到的類型直接就是String類型了。

    【Java泛型是什么】相關文章:

    講解Java的泛型07-13

    java泛型方法10-22

    java泛型方法推薦05-25

    java編譯器的泛型08-09

    Java的泛型擦除和運行時泛型信息獲取11-09

    初步理解Java的泛型特性分享10-09

    Java8自定義帶泛型的函數式接口08-02

    java布爾型介紹10-16

    Java是什么07-03

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人