A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 彭小芳 中级黑马   /  2012-2-15 16:58  /  1755 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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()搞不清楚了。。。求指教

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

4 个回复

倒序浏览
因为java有动态绑定这样一个特性

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

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

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

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
参考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 对象。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
学习了!解释的很清楚
回复 使用道具 举报
二楼说得比较准确,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();// 只能这样

        }

}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马