java泛型学习三:受限制的通配符以及泛型方法
生活随笔
收集整理的這篇文章主要介紹了
java泛型学习三:受限制的通配符以及泛型方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?一、受限制的通配符?
?
package generic; import generic.windcard.Circle; import generic.windcard.Shape; import java.awt.Canvas; import java.util.ArrayList; import java.util.List; //受限制的通配符 public class BoundedWildcard { //說明Circle類繼承自Shape類 private static Circle circle= new Circle(); private static Shape shape=new Shape(); public void drawAll(List<Shape> shapes) { for (Shape s : shapes) { s.draw(new Canvas()); } } public void drawAllWithWildcard(List<? extends Shape> shapes) { for (Shape s : shapes) { s.draw(new Canvas()); } } public static void main(String args[]){ /* * l1與l2對比結果: * drawAll(List<Shape> shapes):只可以接受泛型類型為Shape類型的 * List<? extends Shape> shapes):可以接受泛型類型為Shape及Shape子類的聲明 * * */ BoundedWildcard boundedWildcard=new BoundedWildcard(); List<Shape> l1=new ArrayList<Shape>(); l1.add(circle); boundedWildcard.drawAll(l1); boundedWildcard.drawAllWithWildcard(l1); List<Circle> l2=new ArrayList<Circle>(); l2.add(circle); //boundedWildcard.drawAll(l2); The method drawAll(List<Shape>) in the type BoundedWildcard is not applicable for the arguments (List<Circle>) boundedWildcard.drawAllWithWildcard(l2); /* * l3與l4對比結果: * List<Shape> l3=new ArrayList<Shape>();可以接受泛型類型為Shape及Shape子類的元素 * List<? extends Shape> l4=new ArrayList<Shape>():只可以增加null類型的元素 * */ List<Shape> l3=new ArrayList<Shape>(); l3.add(shape); l3.add(circle); /* *泛型聲明中如果有通配符?,則在這個聲明指向的泛型對象中,除了null不能加入任何的對象。 *即不能把對象放進一個未知類型的集合中去 * */ List<? extends Shape> l4=new ArrayList<Shape>(); // l4.add(shape);//complie error: //l4.add(circle);;//complie error: l4.add(null); } }?二、泛型方法
?
?
package generic;import java.util.Collection; import java.util.LinkedList; import java.util.List;//泛型方法public class GenericMethod {/*說明:這個方法是把數組的元素全部轉存到集合中,但是數組中元素的類型不確定,所以定義集合泛型時使用了通配符,* 但是前面我們已經說過,泛型聲明中如果有通配符?,則在這個聲明指向的泛型對象中,除了null不能加入任何的對象。* 所以c.add(o); 會報編譯錯誤。* 我們使用泛型方法來解決這個問題**/public static void fromArrayToCollection(Object[] a, Collection<?> c) {for (Object o : a) {//c.add(o); // 編譯期錯誤:he method add(capture#1-of ?) in the type// Collection<capture#1-of ?> is not applicable for the// arguments (Object):}}/** 泛型函數允許類型參數被用來表示方法的一個或多個參數之間的依賴關系,或者參數與其返回值的依賴關系。* 如果沒有這樣的依賴關系,不應該使用泛型方法。* **/public static <T> void fromArrayToCollectionWithGeneric(T[] a, Collection<T> c){for (T o : a) {c.add(o); // correct}}}?
?
三、一些細節
?
package generic;import java.util.ArrayList; import java.util.List;public class ImportantThing {public static void main(String args[]){List<String> l1 = new ArrayList<String>();List<Integer> l2 = new ArrayList<Integer>();System.out.println(l1.getClass() == l2.getClass());//result:trueSystem.out.println(l1.getClass()); //result:class java.util.ArrayListSystem.out.println(l2.getClass()); //result:class java.util.ArrayList/** 數組對象的組成類型不能是一個類型變量或者類型參數* 但是可以通配符的類型* */// List<String>[] lsa = new List<String>[10]; //編譯期錯誤:Cannot create a generic array of List<String>List<?>[] lsb=new ArrayList<?>[10];} }??
總結
以上是生活随笔為你收集整理的java泛型学习三:受限制的通配符以及泛型方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java泛型学习二:解惑通配符
- 下一篇: Ehcache学习一:JDBC cach