日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

泛型<E>

發布時間:2024/1/1 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 泛型<E> 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 泛型

  • 泛型:是一種未知的數據類型,當不知道會使用什么數據類型(或同一個方法可能接受不同數據類型),用泛型
  • 泛型也可以作為變量接受數據類型
  • E:未知的數據類型,即泛型,(在JAVA源碼統一使用E,但其實可以是任意字母或單詞)
  • 在創建對象時會確定泛型E的數據類型,并將數據類型作為參數傳遞,賦值給泛型E
  • 泛型沒有繼承的概念,< Integer >并不是< Object >的繼承泛型
  • 泛型可以作為返回值,參數,數據類型,如:public class ArrayList< E >; public bollean add(E e); public E get (int index);

2. 不使用泛型創建集合

利:默認類型Object,可以存儲任意類型 弊:不安全,可能引發異常 ```javaArrayList list =new ArrayList();list.add("asd");//可以添加任意類型list.add(1);for (Object obj:list){System.out.println(obj);//如果想使用String特有的方法,需要向下轉型String s=(String)obj;System.out.println(s.length());//ClassCastException異常:類型轉換異常//因為list中含有Integer類型數據,不能轉換到String ```

3. 使用泛型創建集合

利:避免了類型轉換,把運行期代碼異常,提前到了編譯器期 弊:只能存儲單一類型數據

4. 自定義含泛型的類

加在類名之后 ```java package linxu.day17; public class myEclass<E> {//在類名后加<E>,其內所有和此E相同的數據類型都有E替換private E name;public myEclass() {}public myEclass(E name) {this.name = name;}public E getName() {return name;}public void setName(E name) {this.name = name;} }package linxu.day17;import java.util.ArrayList; import java.util.Iterator; public class demomain {public static void main(String[] args) {demo2();}public static void demo2(){myEclass<String> str= new myEclass<>();//創建自定義泛型數據str.setName("靈虛");System.out.println(str.getName());} } ```

5. 自定義含泛型參數的方法

泛型定義在修飾符和返回值之間,在調用方法時確定泛型的數據類型 格式:`修飾符 < E > 返回值 方法名(參數列表(泛型))` 必須在修飾符和返回值之間加上泛型符號,參數列表才能使用泛型作為參數 ```java package linxu.day17; public class demomain {public static void main(String[] args) {method(1);method("sdc");}public static <M> void method(M m){System.out.println(m);}//這里是一個普通的方法;也可以在其他類中定義含泛型的成員方法,靜態方法等等 } ```

6. 含泛型的接口

含有泛型的接口,有倆種使用方式
  • 定義接口的實現類,同時指定泛型的數據類型//接口 package linxu.day17; public interface myEinterface<I> {//在接口名后加泛型public abstract void method(I i); } //實現類 package linxu.day17; public class myEimpl implements myEinterface<String>{//在實現類名后跟具體的泛型數據類型@Overridepublic void method(String s) {System.out.println(s);} } //使用 package linxu.day17; public class demo2 {public static void main(String[] args) {myEimpl m=new myEimpl();m.method("靈虛");} }
  • 接口使用什么泛型,實現類也跟著接口(相當于定義含義泛型的類,創建對象時才確定數據類型)//實現類 package linxu.day17; public class myEimpl2<E> implements myEinterface<E>{@Overridepublic void method(E e) {System.out.println(e);} } //使用 package linxu.day17; public class demo2 {public static void main(String[] args) {myEimpl2 m2=new myEimpl2();//不使用泛型,默認Object類型m2.method("靈虛天");m2.method(3.3);myEimpl2<Integer> m3=new myEimpl2();//創建對象時確定數據類型m3.method(666);} }
  • 7. 泛型通配符

    當使用泛型類或接口,傳遞的數據仍然不能確定數據類型,使用泛型通配符<?>
    但是,一旦使用了泛型通配符,那么只能使用Objects的共性方法集合中元素自身的方法無法使用
    但是泛型沒有繼承的概念,< Object >并不能表示接受所有數據類型

  • 使用方法:
    不能創建對象使用,只能作為方法參數使用
  • 示例:package linxu.day17; import java.util.ArrayList; import java.util.Iterator; public class demo3 {public static void main(String[] args) {ArrayList<Integer> arrayList1=new ArrayList<>();ArrayList<String> arrayList2=new ArrayList<>();arrayList1.add(1);arrayList1.add(2);arrayList2.add("王五");arrayList2.add("張三");myprint3(arrayList1);myprint3(arrayList2);}//泛型通配符作為參數public static void myprint3(ArrayList<?> list){Iterator<?> it =list.iterator();while(it.hasNext())System.out.println(it.next());}}
  • 泛型通配符作為參數和泛型作為參數public static void myprint3(ArrayList<?> list)//泛型通配符作為參數 public static <M> void method(M m)//泛型作為參數 //通過上面倆個例子,我們發現,泛型通配符作為參數一般是在使用集合,且集合在使用時傳遞數據類型不確定時使用,可以使用集合的方法 //而泛型作為參數,只能對泛型做基本操作,即只能調用Objects類的方法
  • 受限泛型——通配符的高級使用
    (1)泛型的上限
    格式:數據類型 <? extends 類>對象名
    意義:只能接受該類型及其子類
    (2)泛型的下限
    格式:數據類型 <? super 類>對象名
    意義:只能接受該類型及其父類
  • public static void myprint3(ArrayList<? extends Object> list){//限制傳入的參數只能是Object及其子類Iterator<?> it =list.iterator();while(it.hasNext())System.out.println(it.next());}

    總結

    以上是生活随笔為你收集整理的泛型<E>的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。