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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁冬梅 黑马帝   /  2012-4-25 14:28  /  3816 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1.         int [] a1 = new int[2];
  2.         int [] a2 = new int[3];
  3.         int[][] a3 = new int[2][3];
  4.         String [] a4 = new String[2];
  5.         System.out.println(a1.getClass() == a2.getClass());
  6.         System.out.println(a1.getClass()==a3.getClass());//出错 Incompatible operand types Class<capture#8-of ? extends int[]> and Class<capture#9-of ? extends int[][]>
  7.         System.out.println(a1.getClass()==a4.getClass());//出错 Incompatible operand types Class<capture#10-of ? extends int[]> and Class<capture#11-of ? extends String[]>
复制代码
额,为毛我照着张老师的步骤走,到我编译器就说有错误啊?OTZ,鄙视我么?我看了一下,貌似是由于泛型的问题?那为什么张老师的不报错呢?晕。。。
照理来说,每一种类的字节码对应下来应该只是Class类的一个实例对象,那为什么还要对Class类定义泛型呢?比如String.class 的类型是Class<String>,这样有什么意义?

9 个回复

倒序浏览
你的代码如果跟老师的一模一样,老师没出错而你的出错的原因可能是你的运行环境版本跟你的编译器版本不匹配。
回复 使用道具 举报
a1,a2类型相同可以拿来比较,
但a1同a3,a4不同,不可拿来比较,所以编译不过。
回复 使用道具 举报
不同类型的数组字节码不能通过==来比较,也就是说:
     int [] a1 = new int[2];//这个是integer类型的数组
        int [] a2 = new int[3];//这个是integer类型的数组
        int[][] a3 = new int[2][3];//这个是对象为数组的数组
        String [] a4 = new String[2];这个是对象为String类型的数组
它们类型不同不能拿来比较

回复 使用道具 举报
本帖最后由 袁冬梅 于 2012-4-25 21:17 编辑
金超 发表于 2012-4-25 16:35
你的代码如果跟老师的一模一样,老师没出错而你的出错的原因可能是你的运行环境版本跟你的编译器版本不匹配 ...


恩,我后来也是这样想的,泛型是在1.5后出现的,老师的可能是被他成1.4的了。不过Class类定义泛型有什么意义啊?
回复 使用道具 举报
徐鑫 发表于 2012-4-25 20:08
不同类型的数组字节码不能通过==来比较,也就是说:
     int [] a1 = new int[2];//这个是integer类型的数 ...

我比较的不是他们的类型,我比较的是他们的类型获取到的字节码。也就是说她们都是Class的对象[里面都是二进制数据,所以可以用 == 比较],不过现在出的问题是,我的编译器说他们被泛型限定了。就直接不让我比较了

现在我的疑问是,Class这个类弄泛型有什么意义?照理来说,每一个类对应到Class这个类就只是它的一个对象,而且不会重复,那么泛型是限定在哪一方面了呢?
回复 使用道具 举报
徐鑫 中级黑马 2012-4-25 22:24:58
7#
袁冬梅 发表于 2012-4-25 21:23
我比较的不是他们的类型,我比较的是他们的类型获取到的字节码。也就是说她们都是Class的对象[里面都是二 ...

也是啊,貌似能用==比较的数组字节码肯定true,不能比的直接就是编译错误...
回复 使用道具 举报
  1. package text1;

  2. import java.lang.reflect.Method;

  3. public class A{
  4.        
  5.                 public static void main(String[] args) throws Exception {
  6.                         Class class1 = Class.forName("text1.A");
  7.                         Object newInstance2 = class1.newInstance();//不用泛型实例对象的类型是Object
  8.                         Method method = class1.getMethod("run", null);
  9.                         method.invoke(new A(), null);
  10.                         Class<A> name = (Class<A>) Class.forName("text1.A");
  11.                         A newInstance3 = name.newInstance();//用了泛型代码就自动生成了。
  12.                         B newInstance = name.newInstance();//这里报错了,这就是为什么Class类要用泛型。用于不用区别也在这;
  13.                        
  14.                 }
  15.                 public void run(){
  16.                         System.out.println("run");
  17.                 }
  18.         }
  19. class B{
  20.        
  21. }
复制代码
回复 使用道具 举报
袁冬梅 黑马帝 2012-4-26 04:54:52
9#
林德燚 发表于 2012-4-25 23:03

果然,好厉害。我看了代码,实验了一下带了泛型的那个创建出来的A的实例可以直接调用run方法。创建出来的就直接是A这个类的实例了。。。。
代码我收下啦,谢谢啦,O(∩_∩)O~
回复 使用道具 举报
貌似用equals可以搞定,虽然按老师的说法是低端一点{:soso_e127:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马