網(wǎng)站制作學(xué)什么軟件成都網(wǎng)絡(luò)推廣公司
泛型類和泛型方法看起來似乎可以實現(xiàn)類似的功能,但是很多人并未真正掌握泛型方法,網(wǎng)上很多文章說了很多還是似是而非,特別是初學(xué)者還是搞不明白。
一.關(guān)于泛型方法
1.泛型方法可以獨(dú)立于泛型類
2.泛型方法等效于泛型類里泛型參數(shù)方法,實際上也還是泛型方法。
?
我覺得造成這個混亂是Java學(xué)界翻譯的一點(diǎn)問題,或者說是疏忽了這一點(diǎn)。
應(yīng)該分為:非泛型類中的泛型方法,泛型類中的泛型方法
?
代碼一 泛型類Generic:
泛型類有一個帶泛型參數(shù)的方法listAdd,有2個入?yún)⒁粋€泛型數(shù)組,一個泛型List。
功能很簡單就是把數(shù)組元素添加到List里,返回泛型List。
實際上你用非泛型類的泛型方法的寫法加一對菱形表達(dá)式<>也沒錯,但是編譯器會給你提示:參數(shù)類型T隱藏類型參數(shù)T。
下面是非泛型類中的泛型方法listAdd1和普通方法listAdd2:
?
通過對比你就明白了,非泛型類中的泛型方法比泛型類中的泛型方法多了一個菱形表達(dá)式<>而已,僅此而已。?
public class Generic<T>{//泛型類中的泛型參數(shù)方法public List<T> listAdd(T[] arr,List<T> list) {for (T t : arr) {list.add(t);}return list;}
}
//非泛型類中的泛型方法public static <T> List<T> listAdd1(T[] arr, List<T> list) {for (T t : arr) {list.add(t);}return list;}//非泛型類中的普通方法public static List<String> listAdd2(String [] arr, List<String> list) {for (String t : arr) {list.add(t);}return list;}
二.關(guān)于Class<T>和Class<?>
public class Box<T> {private T t;public Box(){}public Box(T data){this.t=data;}public T getT() {return t;}public void setT(T t) {this.t = t;}
}
public static void main(String[] args) {SpringApplication.run(TestApplication.class, args);Box<String> s=new Box<String>("abc");Box<Integer> i=new Box<Integer>(123);System.out.println("s class:" + s.getClass());System.out.println("i class:" + i.getClass());System.out.println(s.getClass() == i.getClass());getData(s);getData(i);}public static <T> void getData(Box<T> data){System.out.println("data :" + data.getT());}
public static void main(String[] args) {SpringApplication.run(TestApplication.class, args);Box<String> s=new Box<String>("abc");Box<Integer> i=new Box<Integer>(123);System.out.println("s class:" + s.getClass());System.out.println("i class:" + i.getClass());System.out.println(s.getClass() == i.getClass());getData(s);getData(i);}public static void getData(Box<?> data){System.out.println("data :" + data.getT());}
可以看到<?>實際上和? 泛型方法是等效的,只要返回值前面加上 <T>就可以了。?
?