PTT
Submit
Submit
选择语言
正體中文
简体中文
PTT
java
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>拿掉....
继续阅读
[问题] Integer初始化的问题
kdok123
[问题] Integer小于一个byte的问题
kdok123
[问题] upnp port问题
aiweisen
Re: [问题] 如何自订一个可以直接=的类别
JustinHere
Re: [问题] static runtime问题
darkk6
Re: [问题] static runtime问题
bleed1979
[问题] static runtime问题
kdok123
[问题] 搞不懂static
wtchen
[问题] 如何自订一个可以直接=的类别
AlphaCall
Re: [问题] 多继承super的问题
bleed1979
Links
booklink
Contact Us: admin [ a t ] ucptt.com