[問題] 關於 wildcard 的疑問

看板java作者 (32767)時間6年前 (2018/06/02 17:53), 6年前編輯推噓0(004)
留言4則, 2人參與, 6年前最新討論串1/1
最近在學習 generic 的知識,看到 wildcard 有一些疑問, 假設我們有一個這樣的 Class class Node<T> { T data; public Node(T data) { this.data = data } public voide setData(T data) { this.data = data; } } 在 Java 中包含 type variable 的 class 是沒有關係的,即便兩個 type variables 有繼承關係。 例如: List<Number> numList = new ArrayList<>(); List<Integer> intList = new ArrayList<>(); numList = intList // compile error 但是 Java 為了增加一些使用上的彈性,增加了一些語法使得開發者們可以在一些限制下 做到上面的操作,就是使用 wildcard type: List<? extends Number> numList = new ArrayList<>(); List<Integer> intList = new ArrayList<>(); numList = intList // ok! 不過這樣的用法是一些有限制的,像是我們沒有辦法增加元素到 numList 裡面 numList.add(1) // compile error 這也是使用 wildcard type 時需要注意到的 PECS 原則 (剩下的就不再贅述,這邊只是讓版友知道我對這個主題目前的理解) -------------------------------------------------------------------------- 回到最開始的 Node 類別,當我想要使用 wildcard type 時 我這樣寫: Node<? extends Number> node = new Node<>(3); // ok (why?) node.setData(1) // compile error 第二行出錯我可以理解,但是我一直想不透為啥第一行是可以成功的 想了很久感覺自己可能陷入思考的誤區,還請版友解惑一下了。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 153.150.177.211 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1527933180.A.179.html ※ 編輯: johnny94 (153.150.177.211), 06/02/2018 17:54:58

06/02 18:53, 6年前 , 1F
new Node<>(3)會被算成 new Node<Integer>(3)
06/02 18:53, 1F

06/02 18:55, 6年前 , 2F
<>是自動找一個可行的類別,不是照抄變數宣告的類別...
06/02 18:55, 2F

06/02 19:01, 6年前 , 3F
....原來是這樣阿,這樣子我馬上懂了...感謝 ssccg!
06/02 19:01, 3F

06/02 19:03, 6年前 , 4F
我真的是一直以為他是照抄變數宣告的類別XDD
06/02 19:03, 4F
文章代碼(AID): #1R4cZy5v (java)
文章代碼(AID): #1R4cZy5v (java)