Re: [問題] Generic 的 cast 問題

作者: changyuheng (張昱珩)   2014-12-23 14:27:45
不好意思再請問,為什麼下面高亮的 (String) 一定要寫?
public class Counter<T> {
private T mEmber;
public Counter<T> setMember(T member) {
mEmber = member;
System.out.println("setMember(): " + mEmber.getClass().getName());
return this;
}
@SuppressWarnings("unchecked")
public T getMember() {
System.out.println("getMember(): " + mEmber.getClass().getName());
System.out.println("getMember(): "
+ ((Class<T>) mEmber.getClass()).getName());
return (T) mEmber;
}
public static void eatString(String s) {
System.out.println("eatString(): " + s);
}
public static void main(String[] args) {
new Counter<String>().setMember("Java");
eatString((String) new Counter<String>().setMember("Java")
.getMember());
}
}
作者: bleed1979 (十三)   2014-12-23 14:31:00
T的關係。而Counter<String> T為String
作者: changyuheng (張昱珩)   2014-12-23 14:44:00
請問既然 T 為 String 為什麼還需要 cast?
作者: bleed1979 (十三)   2014-12-23 14:49:00
覺得是compiler time認得是T。http://en.wikipedia.org/wiki/Generics_in_Java搜尋runtime這個單字,應該能找到些什麼。
作者: ckvir (ckvir)   2014-12-24 01:02:00
因為目前你是傳String,所以你覺得有沒有加都沒差,但是如果你new 的時候傳Int 好了,最後T就變成Int, 可是你的方法只能傳String 所以會有問題或是你把 eatString 參數也改成 T 應該就不用cast 了你說不要管例子,不過你的問題就是因為你的例子才要加(String)你不要加(String)的話可以寫成這樣" target="_blank" rel="nofollow">
作者: changyuheng (張昱珩)   2014-12-24 12:18:00
本來的問題是,T 應該是傳進去的 String,但不知為什麼拿出來是 Object,結果再次 trace 發現應該是因為 T 是 Object,原因如上述。因為 T 是 Object,所以拿出來要當 String 就只好 cast。紅色的部分補上後就可以確保 T 是 String,所以拿出來是 String 不用再轉。eatString 當然能改成吃 T,但這不合理,他就已經叫做 eatString 了,而且他存在的意義就是作為一個要吃 String 的 method 來當範例。
作者: ckvir (ckvir)   2014-12-24 12:58:00
T傳進去和拿出來的都是String阿?哪裡是Object?
作者: changyuheng (張昱珩)   2014-12-24 13:34:00
因為 Counter<String> 變成 Counter<Object>。
作者: ckvir (ckvir)   2014-12-24 15:18:00
我print出來是String不是Object
作者: ssccg (23)   2014-12-24 15:55:00
runtime物件是String,但是對compiler的型態檢查是Object
作者: ckvir (ckvir)   2014-12-24 19:17:00
所以原Po說的是在runtime吧?不過我看都是String
作者: ssccg (23)   2014-12-24 19:33:00
要加(String)才能compile當然是指compile time...是說原po都寫了問題是setMember的回傳type之前少了<T>你要重現問題去試記得先把那個<T>拿掉....

Links booklink

Contact Us: admin [ a t ] ucptt.com