泛型类,泛型接口,泛型方法,底层擦除机制,可变参数,限类型通配符,反编译xjad
泛型類,泛型接口都是在類名,接口名后尖括號
泛型方法在返回類型前尖括號 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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何远程控制相机
- 下一篇: 高数下部分公式及部分知识点整理