cast是指NewType x = (NewType) y;这样的方式,这个一定是要在编译期完成的,即使是范型,你可以class MyClass<T> { T[] array = new T[10]; public T get(int i) { return array[i]; } }但是你也要MyClass<String> a = new MyClass<String>(); String s = a.get(0); 或者MyClass b = new MyClass(); Object o = a.get(0); String s = (String) o; 也就是说类型(Type)一定要在编译期(Compile Time)显式(Explicitly)指定或者改变(cast)而在运行期(Runtime),如果没有在编译期指定的话,你只能得到的是内容而非类型的变化。比如你有一个Object,getClass()它返回的就是Class类型,这个类型是不会变的(当然,1.5Class也是范型,不过如上所述,需要编译期指定),变得只是这个Class代表的内容不同。
JDK1.5以后,可以cast回原形,但是仍然需要在编译期确定比如Class<A> clazz = (Class<A>) obj.getClass(); A a = clazz.cast(obj);这里面A不管是作为a的类型还是clazz范型时的参数,都需要在编译期(编码时)确定 这个和A a = (A) a从本质上没有太大区别当然,用了Class.cast()可以接受一个从其他地方传来的参数,或者本身也使用范型(也就是让调用者来确定类型T),但是归根结底,这个类型如需要事先确定,而无法简简单单根据运行时的内容(比如一个String的内容,"java.util.Date"来确定)
直接getClass() 有了Class 后俺发现想干什么都可以,哈哈
我对 believefym(暮色,miss,迷失,miss) 说这样的话有点失望,难道你原先一直以为return java.lang.Object.class?
呵呵,个人愚见
我对 believefym(暮色,miss,迷失,miss) 说这样的话有点失望,难道你原先一直以为return java.lang.Object.class?-----------------------
受教了,这个确实不太懂,也没研究过
shine333(enihs)能否对
“这个不是cast,你手上的还是Object类型,因为cast是对应于强类型的编译期。”
再解释一下,或者给个例子说明一下
T[] array = new T[10];
public T get(int i) { return array[i]; }
}但是你也要MyClass<String> a = new MyClass<String>(); String s = a.get(0);
或者MyClass b = new MyClass(); Object o = a.get(0); String s = (String) o;
也就是说类型(Type)一定要在编译期(Compile Time)显式(Explicitly)指定或者改变(cast)而在运行期(Runtime),如果没有在编译期指定的话,你只能得到的是内容而非类型的变化。比如你有一个Object,getClass()它返回的就是Class类型,这个类型是不会变的(当然,1.5Class也是范型,不过如上所述,需要编译期指定),变得只是这个Class代表的内容不同。
A a = clazz.cast(obj);这里面A不管是作为a的类型还是clazz范型时的参数,都需要在编译期(编码时)确定
这个和A a = (A) a从本质上没有太大区别当然,用了Class.cast()可以接受一个从其他地方传来的参数,或者本身也使用范型(也就是让调用者来确定类型T),但是归根结底,这个类型如需要事先确定,而无法简简单单根据运行时的内容(比如一个String的内容,"java.util.Date"来确定)