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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 韩伟 中级黑马   /  2012-7-17 08:17  /  2447 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 韩伟 于 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 09:58

8 个回复

正序浏览
孙新强 发表于 2012-7-17 08:56
我认为 这不是泛型的问题  而是数组下标越界的问题  请同学们运行一下程序 看一下
通过我修改了几次运行 我 ...

这是我在 eclipse中运行了几种不同情况后 自己的看法  加入了大家讨论的泛型结果没有什么改变 查了API文档
API文档中解释为 remove(Object o) 删除的是元素对象 但是看看程序运行的结果 我很不理解 于是 我想到了 arraylist的底层实现原理 我怀疑是角标问题 在eclipse中运行显示的也是角标越界异常 于是 我把remove(12)  改为remove(2)  运行 结果ok  因此 我证实了自己的推断 拿出给大家讨论
回复 使用道具 举报
程潇 中级黑马 2012-7-17 10:10:18
8#
孙新强 发表于 2012-7-17 08:56
我认为 这不是泛型的问题  而是数组下标越界的问题  请同学们运行一下程序 看一下
通过我修改了几次运行 我 ...

用eclipse测试,是数组下标越界。
你再用命令行试试,就会出现楼主说的问题了
回复 使用道具 举报
王飞 中级黑马 2012-7-17 10:04:38
7#
泛型会告诉你滴{:soso_e113:}
回复 使用道具 举报
我认为 这不是泛型的问题  而是数组下标越界的问题  请同学们运行一下程序 看一下
通过我修改了几次运行 我认为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:00
回复 使用道具 举报
出现这以警告的原因是属泛型的原因,因为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)
回复 使用道具 举报
马上就可以解决这个问题了。泛型就是它的解决方案。继续学习就可以了。
回复 使用道具 举报
这个警告的意思是说集合里装的对象类型不确定
在后面使用泛型后就能解决了
{:soso_e121:}
回复 使用道具 举报
建议继续学习,学到泛型立马就明白了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马