Re: [問題] 有關generics泛型的函式參數super用法

看板java作者 (偶爾想擺爛一下)時間15年前 (2011/03/04 20:27), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《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
謝謝你,我想我該去更深入了解你說的key word
03/06 13:09, 1F
文章代碼(AID): #1DSDgUOf (java)
文章代碼(AID): #1DSDgUOf (java)