通配符wildcard字元'?'在使用上配合extends(配合class)或是implements(配合 interface)
可以用來控制輸入的類型(Upper Bounded Wildcards)
像是
<? extends Number> 就是限制輸入的型態必須要是Number的子類別才可以

另一種就是不限制讓輸入的類型可以是任意種類(Unbounded Wildcards)

ex:
public static void printList(List<?> list) {
for (Object elem: list)
System.out.print(elem + " ");
System.out.println();
}

List<Integer> li = Arrays.asList(1, 2, 3);
List<String> ls = Arrays.asList("one", "two", "three");
printList(li);
printList(ls);

還有一種狀況是使用super (Lower Bounded Wildcards)
當輸入的參數都是繼承自某一class
而只需要使用其某項屬性時就可以用super
可參考https://openhome.cc/Gossip/Java/Generics-super.html

泛型還可以建立子類別的關係
像是
class A { /* ... */ }
class B extends A { /* ... */ }

B b = new B();
A a = b;

List<B> lb = new ArrayList<>();
List<A> la = lb; // compile-time error

這樣會發生錯誤
但如果用? extends 的方式就可以避免了
List<? extends Integer> intList = new ArrayList<>();
List<? extends Number> numList = intList; // OK. List<? extends Integer> is a subtype of List<? extends Number>

 

1. 官網https://docs.oracle.com/javase/tutorial/java/generics/wildcards.html

01.png  

arrow
arrow
    文章標籤
    Java Wildcards
    全站熱搜

    RX1226 發表在 痞客邦 留言(0) 人氣()