黑马程序员技术交流社区

标题: 反射的问题 [打印本页]

作者: 彭小芳    时间: 2012-2-15 16:58
标题: 反射的问题
本帖最后由 pengfangjava 于 2012-2-16 16:44 编辑
  1. package reflection;

  2. import java.lang.reflect.Constructor;

  3. public class Test {

  4.    
  5.     public static void main(String[] args) {
  6.         Class<String> cl = String.class;//正确
  7.         Class<String> cl1 = new String().getClass(); //错误
  8.         Class<? extends String> cl2 = new String().getClass();//只能这样
  9.     }

  10. }
复制代码
String.class和new String().getClass()搞不清楚了。。。求指教
作者: 冯祖焱    时间: 2012-2-15 17:03
因为java有动态绑定这样一个特性

Class<String> cl1 = new String().getClass(); //错误

因为你new一个对象,在编译时期无法确定你new的是什么对象,只能说你new的对象必须是String或者String的子类,虽然String类final的,其他类同理。

所以 Class<? extends String> cl2 = new String().getClass();//只能这样
作者: 刘基军    时间: 2012-2-15 17:12
参考API中Object类的getClass()描述:
getClass
public final Class<?> getClass()返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
实际结果类型是 Class<? extends |X|>,其中 |X| 表示清除表达式中的静态类型,该表达式调用 getClass。 例如,以下代码片段中不需要强制转换:

Number n = 0;
Class<? extends Number> c = n.getClass();

返回:
表示此对象运行时类的 Class 对象。

作者: 最初的理想    时间: 2012-2-15 19:10
学习了!解释的很清楚
作者: 李建锋    时间: 2012-2-15 21:30
二楼说得比较准确,java在编译时期只检查语法错误,即在编译时期无法知道new String().getClass()的返回值是String.class,所以就不可以那样干了,还可以用一下方式搞一下!


package com.itcast.day01;

import java.lang.reflect.Constructor;

public class Test {

        public static void main(String[] args) {

                Class<String> cl = String.class;// 正确

               
                String s2="asa";
               
                Class<String> cl1 = (Class<String>) s2.getClass(); //在此进行强制转换!

                Class<? extends String> cl2 = new String().getClass();// 只能这样

        }

}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2