黑马程序员技术交流社区

标题: 早上编译程序时遇到的一个问题 [打印本页]

作者: 韩伟    时间: 2012-7-17 08:17
标题: 早上编译程序时遇到的一个问题
本帖最后由 韩伟 于 2012-7-17 11:35 编辑

昨天晚上看到ArrayList,所以今天早上就写个小程序试试,程序如下:
import java.util.*;
class TestDemo
{
         public static void main(String[] args)
        {
                 ArrayList aa = new ArrayList();
                 aa.add("abc");
                 aa.add(12);
                 System.out.println(aa);
                 aa.remove(12);
                 System.out.println(aa);
         }
}
编译时无法通过,提示为:
谁能给解释一下,还有那个-Xlint:unchecked是什么意思,该怎么用啊?


作者: 黑马振鹏    时间: 2012-7-17 08:21
建议继续学习,学到泛型立马就明白了。
作者: 王龙彪    时间: 2012-7-17 08:29
这个警告的意思是说集合里装的对象类型不确定
在后面使用泛型后就能解决了
{:soso_e121:}
作者: 樊佰轩    时间: 2012-7-17 08:33
马上就可以解决这个问题了。泛型就是它的解决方案。继续学习就可以了。
作者: 焦晨光    时间: 2012-7-17 08:50
出现这以警告的原因是属泛型的原因,因为1.4的有些写法在1.6下是被认为不安全的,所以被禁用了!
解决方法:
1.编译时带上参数-source 1.4
2.使用@SupressWarnings("unchecked")注释
3.更新你的代码,使用List<Object>. List<Object>的实例能接受任何类型的对象,就像是一个原型List。然而,编译器不会报错。
(以上三种方法来源:http://www.matrix.org.cn/resource/article/43/43634_java_generics.html)

作者: 孙新强    时间: 2012-7-17 08:56
我认为 这不是泛型的问题  而是数组下标越界的问题  请同学们运行一下程序 看一下
通过我修改了几次运行 我认为remove()用法应该是: 首先API文档中是说从此列表中移除指定元素的单个实例(如果存在)
但是,如果arraylist中加入的是整数的话,使用remove()移除时,JVM会认为是按照数组下表移除的 (这里做一下说明,arraylist底层实现原理是数组)  所以在这个题中 remove(12)是不对的
修改代码如下:
import java.util.*;
class TestDemo
{
         public static void main(String[] args)
        {
                 ArrayList aa = new ArrayList();
                 aa.add("abc");
                 aa.add(12);
                 System.out.println(aa);
                 aa.remove(1);
                 System.out.println(aa);
         }
}

加入泛型后代码如下:
import java.util.*;
class TestDemo
{
         public static void main(String[] args)
        {
                 ArrayList<Integer> aa = new ArrayList<Integer>();
                 aa.add(33);
                 aa.add(12);
                 System.out.println(aa);
                 aa.remove(1);
                 System.out.println(aa);
         }
}

作者: 王飞    时间: 2012-7-17 10:04
泛型会告诉你滴{:soso_e113:}
作者: 程潇    时间: 2012-7-17 10:10
孙新强 发表于 2012-7-17 08:56
我认为 这不是泛型的问题  而是数组下标越界的问题  请同学们运行一下程序 看一下
通过我修改了几次运行 我 ...

用eclipse测试,是数组下标越界。
你再用命令行试试,就会出现楼主说的问题了
作者: 孙新强    时间: 2012-7-17 11:16
孙新强 发表于 2012-7-17 08:56
我认为 这不是泛型的问题  而是数组下标越界的问题  请同学们运行一下程序 看一下
通过我修改了几次运行 我 ...

这是我在 eclipse中运行了几种不同情况后 自己的看法  加入了大家讨论的泛型结果没有什么改变 查了API文档
API文档中解释为 remove(Object o) 删除的是元素对象 但是看看程序运行的结果 我很不理解 于是 我想到了 arraylist的底层实现原理 我怀疑是角标问题 在eclipse中运行显示的也是角标越界异常 于是 我把remove(12)  改为remove(2)  运行 结果ok  因此 我证实了自己的推断 拿出给大家讨论




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