日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

泛型类,泛型接口,泛型方法,底层擦除机制,可变参数,限类型通配符,反编译xjad

發布時間:2023/12/31 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 泛型类,泛型接口,泛型方法,底层擦除机制,可变参数,限类型通配符,反编译xjad 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
public class test01 {//泛型可以用在方法接口類,泛型的類型只能是引用類型而不是基本類型public static void main(String[] args) {ArrayList<Object> ob = new ArrayList<>();//new 集合沒有指定泛型 存放的類型是object,//集合的迭代器ArrayList strings = new ArrayList<>();strings.add("m1");strings.add("s1");strings.add("c1");strings.add(12);Iterator myiterator=strings.iterator();while(myiterator.hasNext()){//如果取出stirngs 的存放類型,會發現object類型//為了避免類型轉換異常,要先對類型進行判斷Object next = myiterator.next();//自動補全ctrl+aalt+vif (next instanceof String)//類型匹配instanceof{String str=(String)next;//強制轉換System.out.println(str);}if(next instanceof Integer){int a=(Integer) next;System.out.println(a);}// String str=(String)myiterator.next();//做個強轉//String str=myiterator.next();//直接轉會報錯,因為存儲的是object// System.out.println(myiterator.next());一般形式下這樣遍歷// System.out.println(str);//12會報錯,因為Integer類型不能強轉成Stirng}} }

泛型類,泛型接口都是在類名,接口名后尖括號

泛型方法在返回類型前尖括號 public <T> T show(T t){}

--------------------------------------------------------------------------

泛型類,類中的成員屬性T 類上定義的泛型類型相同

public class mayikt <T>{private T t;public T getT() {return t;}public void setT(T t) {this.t = t;} }//泛型類,在類中定義的成員屬性 T 和類上定義的泛型是同一個

這樣,創建mayikt類的不同對象,每個對象使用的類型T是不一樣的,每個對象的成員方法所用的泛型也是獨特的

public class test02 {public static void main(String[] args) {mayikt<String> str=new mayikt<>();//str是mayikt類的一個對象,使用的泛型Stringstr.setT("Q");System.out.println(str.getT());mayikt<Integer> interger=new mayikt<>();//integer是同一類的另一個對象,使用的泛型Integerinterger.setT(12);System.out.println(interger.getT());mayikt ob=new mayikt<>();//有尖括號就算使用泛型,但沒規定泛型種類默認Object,是所有引用類型的父類ob.setT("1122");ob.setT(1222);} }

---------------------------------------------------------------------------------------------------------------------------------

泛型方法,可以用一個類型的同一個對象,但是 方法 的 參數的泛型 和 方法的泛型是一一對應的

public class meite {public <T> T show(T t){return t;}//泛型方法,同一對象,傳的參數泛型不同,可以用ctrl+alt+v自動補全來驗證 } public class test03 {public static void main(String[] args) {meite m=new meite();System.out.println(m.show("aaa"));//<String> String show(String str)System.out.println(m.show(12));/*快捷鍵ctrl+alt+v//自動識別返回類型integer,并用show接收*/Integer show = m.show(13);Double show1 = m.show(12.3);

----------------------------------------------------------------------------------------------------------------

泛型接口

接口規定泛型,繼承接口的類也會使用此泛型

?用到了兩個泛型,show方法的泛型M 類的泛型T,方法返回值類型T

public interface Maiyiinterface <T>{T show(T t); }public class MaiyiIMPL<T> implements Maiyiinterface<T>{@Overridepublic T show(T t) {return t;} }public class test03 {public static void main(String[] args) {//泛型接口MaiyiIMPL<String> stringMaiyiIMPL = new MaiyiIMPL<>();stringMaiyiIMPL.show("a");MaiyiIMPL<Integer> integerMaiyiIMPL = new MaiyiIMPL<>();integerMaiyiIMPL.show(12);} }

-----------------------------------------------------------------------------------------------------------

可變參數 String...a,范型底層擦除機制

可變參數是基于數組實現的

package first.day01; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class test04 {public static void main(String[] args) {System.out.println(sum(1,1,1));//int...a 可變參數是基于數組實現a[0]=1,a[1]=1...//因為數組長度不能確定,所以有別的參數時把可變參數往往放最后sum2(0,1,1);Arrays.asList();//ctrl+shift+i 進入源碼,發現用的就是可變參數,傳入一些參數,返回一個集合List<String> strings = Arrays.asList("a", "x", "v");//List<xxx> xxx這樣接住//但是使用arrays.aslist創建的集合是不能進行添加和刪除的,因為創建完了·集合元素個數是不能改變的,不過可以進行修改strings.set(0,"m");//輸出[m,x,v]System.out.println(strings);//直接把集合輸出,不會輸出地址ArrayList<String> strings1 = new ArrayList<>();List newlist=strings1;//不要用尖括號,即使是object類型也已經使用泛型了,不可以newlist.add(12);//泛型底層的擦除機制,把使用泛型的集合整個付給沒使用泛型的集合,泛型就會被擦出,add時不會限制傳遞類型/*泛型是在編譯階段限制傳遞的類型 在運行階段都是擦除底層·class文件 在運行時是 沒有使用泛型的如何證明:run一下,在out文件夾里拖進xjad反編譯發現沒用泛型*/}public static int sum(int ...a) {int s = 0;for (int i = 0; i < a.length; i++) {s = s + a[i];}return s;}public static void sum2(int b,int ...a){System.out.println("不參與運算"+b);for(int i:a)//證實a是個數組形式存儲的{System.out.println(i);}} } public class xjad {public static void main(String[] args) {ArrayList<String> sr=new ArrayList<>();List l=sr;l.add(12);//run后在out找到拖進xjad反編譯發現源碼根本沒用到泛型,這時l的泛型類型object} }

?----------------------------------------------------------------------

類型通配符

?類型通配符不能add?因為還沒限制操作的泛型類型,一般用于接收,剩下的操作用if條件句自己編

帶通配符的可以get操作,得到的類型是object

public class test03 {public static void printlist(ArrayList<?> thelist){Object o = thelist.get(0);}public static void main(String[] args) {ArrayList<String> str=new ArrayList<String>();ArrayList<Integer> integers = new ArrayList<>();printlist(str);

?alt+ctrl+shift+a 截長圖

截圖 alt+a

找構造器,getter等:alt+insert

?

?

總結

以上是生活随笔為你收集整理的泛型类,泛型接口,泛型方法,底层擦除机制,可变参数,限类型通配符,反编译xjad的全部內容,希望文章能夠幫你解決所遇到的問題。

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