Re: [問題] 有關generics泛型的函式參數super用法
※ 引述《pankk (KK)》之銘言:
: 小弟最近在學java觀念上遇到了些難題,
: 想請教各位一個問題:
: 在泛型函式中為了要使class Write裡的setName(T)可以不為read-only,
: class test裡的WriteName函式把它參數形式改為(Write<? super String>),
: 使得在寫入name時可以編譯通過,
: 但是我想不懂的是我又加了一行setName(new Object())它就編不過,
: 我在想我邏輯是不是又亂了,好不容易稍微看懂為啥要用super取代extends了,
: 沒想到又卡住了...Orz,我是不是觀念認知出了些差錯?
: //=========================================
: class Write<T> {
: private T name;
: public Write(T value) {
: name = value;
: }
: public void setName(T a_name) {
: name = a_name;
: }
: public T getName() {
: return name;
: }
: }
: public class test {
: public static void main(String[] args) {
: test t= new test();
: t.WriteName(new Write("Ha"));
: t.WriteName(new Write(new Object()));
: }
: public void WriteName(Write<? super String> value) {
: //value.setName(new Object()); //compile error
: value.setName("Test2");
: System.out.println(value.getName());
: }
: }
: //=========================================
對一個 Write<? super String> object 進行 setName 操作,所給定的參數值
至少得是 String(得是 String or String derived type),類比於
Write<? extends String> object 進行 getName 操作所產出的值至少會是
String。
Write<? super String> reference 可以用來操作
Write<String>,
Write<java.io.Serializable>,
Write<CharSequence>,
Write<Comparable<String>>,
Write<Object>
這些類的物件,不管是哪一種,當你提供 String object 來進行 setName 操作
都是可以的,因為 String 相容於上面任一種 type argument。
如果想要更深入的去了解這方面的東西,可以 "covariance" "contravariance"
為關鍵字去找相關的資料。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.136.168.158
※ 編輯: sbrhsieh 來自: 220.136.168.158 (03/04 20:29)
推
03/06 13:09, , 1F
03/06 13:09, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):