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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵宇 中级黑马   /  2012-9-20 20:42  /  3152 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 赵宇 于 2012-9-25 08:40 编辑

这个程序的错误点在哪里?说出理论依据

问题程序.png (5.13 KB, 下载次数: 36)

问题程序.png

评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 赞一个!

查看全部评分

15 个回复

倒序浏览
new Integer(1)这样new出来的应该是一个对象。后面不能够强制转换对象
回复 使用道具 举报
我看出来了 是你向下转型出了问题

因为list.toarray()返回的是Object类型的,你却非要转为Integer类型,所以会出错

可以改成这样Array<Integer> list=new ArrayList<Integer>();

再把下面那句该这样:Integer in=list.toArray(new Integer[list.size()]);


这样就不会报错了

回复 使用道具 举报
明光照 发表于 2012-9-20 20:54
new Integer(1)这样new出来的应该是一个对象。后面不能够强制转换对象

多态啊  返回的是object 类型转化为 Integer  有什么不可以
回复 使用道具 举报
张小龙 发表于 2012-9-20 20:55
我看出来了 是你向下转型出了问题

因为list.toarray()返回的是Object类型的,你却非要转为Integer类型 ...

因为list.toarray()返回的是Object类型的,你却非要转为Integer类型,所以会出错

根据多态这样不会出错。 问题不在这里 数组类型,你仔细看看
回复 使用道具 举报
本帖最后由 杨卫腾 于 2012-9-20 21:20 编辑

import java.util.ArrayList;

class Test2
{
        public static void main(String[] args)
        {
                ArrayList list = new ArrayList();

                list.add(new Integer(1));
                list.add(new Integer(2));
                list.add(new Integer(3));
                list.add(new Integer(4));
               
                Integer[] in = (Integer[])list.toArray(new Integer[list.size()]);

                for(int i=0; i<in.length; i++)
                {
                        System.out.println(in.intValue());
                }
        }
}

哥们看看这样会不会好呢?   是你在构造数组的时候出现了问题
应该使用  <T> T[]  toArray(T[] a)  
回复 使用道具 举报
赵宇 中级黑马 2012-9-20 21:23:28
7#
杨卫腾 发表于 2012-9-20 21:16
import java.util.ArrayList;

class Test2

你的解决办法是好的
问题是我这个错误object[]为什么不能转成Integer[]?
thank u
回复 使用道具 举报
疯子雨 发表于 2012-9-20 21:23
你的解决办法是好的
问题是我这个错误object[]为什么不能转成Integer[]?
thank u

  toArray()返回的Object[] 是返回时创建的类型,
  创建的是真实的父类对象

  向下转到子类Integer[] 当然是非法的cast,所以会报错.
  相当于  Animal a = new Animal();
              Cat c = (Cat) a;
  当然是不允许的了。

但是下面的这个是合法的
     Aninal a = new Cat();
             Cat c = (Cat) a;  这个是合法的, 向下转型。

回复 使用道具 举报
夏天 初级黑马 2012-9-20 21:30:30
9#
本帖最后由 夏诗瑶 于 2012-9-22 00:39 编辑

目测编译没有错误。
Integer[] in = (Integer[]) list.toArray(); //因为编译时,系统看左右两边类型相同。

但运行时会发生错误。//至于为什么会错,开始我也纠结在这了,后来多方求证,发现这是一个弱智问题。打击好大!!//最简单的解释就是数组不是一种数据类型,它只是一个容器,所以不能用数组进行强转!!能强转的只能是数据类型之间,准确的叫数组是一个数据结构,不属于数据类型。如果确实需要强转。可以遍历数组,将其中每个元素都进行强转

//也就是说,你是在进行数据结构的强转★★★★★★★。为了更方便的认识这个错误,特举例如下
Person[] ps = new Person[2];
ps[0] = new Person();
ps[1] = new Person();
Integer[] in = (Integer[]) ps;// Cannot cast from Person[] to Integer[]


解释如下

其实这考的是集合的toArray()方法。你要修改运行时强转的问题,API中提供了一个带泛型的toArray(T[] a)方法.

API中是这样描述的:toArray(T[] a)   按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。

所以只要如下修改就可以了:

Integer[] in =list.toArray(new Integer[list.size()]);

ps:已向老师请教,目测回答没有错。
回复 使用道具 举报
夏诗瑶 发表于 2012-9-20 21:30
目测编译没有错误。
Integer[] in = (Integer[]) list.toArray(); //因为编译时,系统看左右两边类型相同。 ...

thank  u
Integer[] in = (Integer[]) list.toArray(); 问题确实出在这里。可是object[]为什么不能转成Integer[]
回复 使用道具 举报
疯子雨 发表于 2012-9-20 21:41
thank  u
Integer[] in = (Integer[]) list.toArray(); 问题确实出在这里。可是object[]为什么不能转成I ...

在上面重新编辑回复了。希望能够Ok~~
回复 使用道具 举报
疯子雨 发表于 2012-9-20 21:41
thank  u
Integer[] in = (Integer[]) list.toArray(); 问题确实出在这里。可是object[]为什么不能转成I ...

你可以查下api
toArray()方法返回的是Object数组,里面存的是Object对象,就相当于Object[] o=new Object[];既然里面是Object对象怎么可以把父类转换成子类对象呢。这样说不知道明白了吗? 仔细看看api
回复 使用道具 举报
其实大家都没有说出原因 object[]为什么不能转成Integer[]
回复 使用道具 举报
疯子雨 发表于 2012-9-21 07:25
其实大家都没有说出原因 object[]为什么不能转成Integer[]

我上面说了。。。
回复 使用道具 举报
其实楼上有些人的回复就是对的,只是楼主没有完全弄清楚
编译时类型和运行时类型的区别,只有运行时类型和强转类
型相同时,才能强转,否则就会出现编译时通过,运行时出错的情况。
回复 使用道具 举报
尤洋 发表于 2012-9-21 09:28
其实楼上有些人的回复就是对的,只是楼主没有完全弄清楚
编译时类型和运行时类型的区别,只有运行时类型和 ...

thank u  完全理解了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马