楼主: silver_xie

[SCJP] The type List<A> is assignable to List.没错吧?(解决)

[复制链接]
论坛徽章:
3
生肖徽章2007版:牛
日期:2008-09-25 19:22:372009新春纪念徽章
日期:2009-01-04 14:52:28生肖徽章2007版:狗
日期:2009-01-14 14:14:37
11#
发表于 2008-2-15 15:38 | 只看该作者
A当然不对了,有了泛型约束,怎么可能付给没有泛型的

你说的兼容问题,是说在一个定义好的泛型的collection里,可以放泛型定义以外类型的对象

比如
List<String> list = new ArrayList<String>();
list.add(new Integer(3));

这种情况下,编译器给你一个警告而已

你也糊涂了吧

使用道具 举报

回复
论坛徽章:
8
开发板块每日发贴之星
日期:2007-12-23 01:06:08开发板块每日发贴之星
日期:2007-12-24 01:05:56开发板块每日发贴之星
日期:2007-12-27 01:05:492008新春纪念徽章
日期:2008-02-13 12:43:03开发板块每日发贴之星
日期:2008-02-14 01:02:08开发板块每日发贴之星
日期:2008-02-15 01:05:13开发板块每日发贴之星
日期:2008-02-16 01:06:48开发板块每日发贴之星
日期:2008-02-17 01:05:20
12#
 楼主| 发表于 2008-2-15 15:39 | 只看该作者
当然可以了,为了scjp5为了兼容non-generic阿!!!书上说虽然把generic和non-generic放一起很危险,但是还是可以的阿。。。。。你在msn上么〉〉〉

使用道具 举报

回复
论坛徽章:
8
开发板块每日发贴之星
日期:2007-12-23 01:06:08开发板块每日发贴之星
日期:2007-12-24 01:05:56开发板块每日发贴之星
日期:2007-12-27 01:05:492008新春纪念徽章
日期:2008-02-13 12:43:03开发板块每日发贴之星
日期:2008-02-14 01:02:08开发板块每日发贴之星
日期:2008-02-15 01:05:13开发板块每日发贴之星
日期:2008-02-16 01:06:48开发板块每日发贴之星
日期:2008-02-17 01:05:20
13#
 楼主| 发表于 2008-2-15 15:40 | 只看该作者
我给你看看我的程序
是可以编译的

import java.util.*;

public class Q179
{
        static void test(List l){
                System.out.println(l);
        }
       
        public static void main(String[] args)
        {
                List<A> la=new ArrayList<A>();  
        List l=la;
                List ll=new ArrayList<A>();
                System.out.println("ll "+ll);
                System.out.println("l and la "+" "+la);
                List<? extends B> l_exB=new ArrayList<B>();;
                List<? extends A> l_exA=l_exB;
                System.out.println("l_exB and l_exA "+l_exB+" "+l_exA);

                test(la);
        }
}

class A {}
class B extends A {}
class C extends A {}
class D extends B {}

使用道具 举报

回复
论坛徽章:
8
开发板块每日发贴之星
日期:2007-12-23 01:06:08开发板块每日发贴之星
日期:2007-12-24 01:05:56开发板块每日发贴之星
日期:2007-12-27 01:05:492008新春纪念徽章
日期:2008-02-13 12:43:03开发板块每日发贴之星
日期:2008-02-14 01:02:08开发板块每日发贴之星
日期:2008-02-15 01:05:13开发板块每日发贴之星
日期:2008-02-16 01:06:48开发板块每日发贴之星
日期:2008-02-17 01:05:20
14#
 楼主| 发表于 2008-2-15 16:14 | 只看该作者

答案出自

Java 5.0泛型编程之泛型类型2005-10-18 09:18 作者: cat 出处: Matrix 责任编辑:方舟
                            // Here's a basic parameterized list.
                List<Integer> li = new ArrayList<Integer>();
                // Wrap it for runtime type safety
                List<Integer> cli = Collections.checkedList(li, Integer.class);
                // Now widen the checked list to the raw type
                List lll = cli;   
                // This line compiles but fails at runtime with a ClassCastException.
// The    exception occurs exactly where the bug is, rather than far awayl.add("hello");
                lll.add("hello");

使用道具 举报

回复
论坛徽章:
3
生肖徽章2007版:牛
日期:2008-09-25 19:22:372009新春纪念徽章
日期:2009-01-04 14:52:28生肖徽章2007版:狗
日期:2009-01-14 14:14:37
15#
发表于 2008-2-15 16:28 | 只看该作者
一旦check了,就会在runtime阻止其他类型的对象的进入,于是出现异常

一旦不check,就不会出现异常。

好像是这个意思。

题目不够严谨。

使用道具 举报

回复
论坛徽章:
8
开发板块每日发贴之星
日期:2007-12-23 01:06:08开发板块每日发贴之星
日期:2007-12-24 01:05:56开发板块每日发贴之星
日期:2007-12-27 01:05:492008新春纪念徽章
日期:2008-02-13 12:43:03开发板块每日发贴之星
日期:2008-02-14 01:02:08开发板块每日发贴之星
日期:2008-02-15 01:05:13开发板块每日发贴之星
日期:2008-02-16 01:06:48开发板块每日发贴之星
日期:2008-02-17 01:05:20
16#
 楼主| 发表于 2008-2-15 17:15 | 只看该作者

最后的整理哦,说实话这题还真不简单,先说A(sinkler你看看)

测试程序
                     List<A> list_array=new ArrayList<A>();  
                                List list=list_array;
               
                list.add("List<A>");
                A a=new A();
                list.add(a);
               
                System.out.println("list="+list);
                System.out.println("list.get(0)="+list.get(0));
                System.out.println("list.get(1)="+list.get(1));
                /Object o=list.get(1);                works well
                //a=list.get(1);                          //can not compile
                a=(A)(list.get(1));                // ok
                list.remove(a);
                System.out.println("after remove(a) list="+list);
                list.remove(a);
                System.out.println("after remove(a) list="+list);

所谓的assignable可能就是指   你可以add() 但是你不能用任何方法取回specific type, now is A的对象了。表现在A a=list.get(1);这句话不能被编译上A类型在经过add之后,变成了Object类型。当然你可以强制转换类型来实现。

使用道具 举报

回复
论坛徽章:
8
开发板块每日发贴之星
日期:2007-12-23 01:06:08开发板块每日发贴之星
日期:2007-12-24 01:05:56开发板块每日发贴之星
日期:2007-12-27 01:05:492008新春纪念徽章
日期:2008-02-13 12:43:03开发板块每日发贴之星
日期:2008-02-14 01:02:08开发板块每日发贴之星
日期:2008-02-15 01:05:13开发板块每日发贴之星
日期:2008-02-16 01:06:48开发板块每日发贴之星
日期:2008-02-17 01:05:20
17#
 楼主| 发表于 2008-2-15 17:32 | 只看该作者

正确答案C:无法使用add(),因为所有用通配符的地方都不能用add()

可为啥C是正确答案呢???测试程序如下
                     List<Object> list_o=new ArrayList<Object>();
                List<?> list=list_o;

                A a=new A();
                //list.add(a);                           compile error
                list.add(new Object());         //still compile Error
                System.out.println("list="+list);
                System.out.println("list.get(0)="+list.get(0));
                System.out.println("list.get(1)="+list.get(1));

使用道具 举报

回复
论坛徽章:
8
开发板块每日发贴之星
日期:2007-12-23 01:06:08开发板块每日发贴之星
日期:2007-12-24 01:05:56开发板块每日发贴之星
日期:2007-12-27 01:05:492008新春纪念徽章
日期:2008-02-13 12:43:03开发板块每日发贴之星
日期:2008-02-14 01:02:08开发板块每日发贴之星
日期:2008-02-15 01:05:13开发板块每日发贴之星
日期:2008-02-16 01:06:48开发板块每日发贴之星
日期:2008-02-17 01:05:20
18#
 楼主| 发表于 2008-2-15 17:43 | 只看该作者

答案D没有任何warning,编译成功

List<D> list_o=new ArrayList<D>();
                List<? extends B> list=list_o;

                list_o.add(new D());
                System.out.println("list="+list);
                System.out.println("list.get(0)="+list.get(0));

使用道具 举报

回复
论坛徽章:
8
开发板块每日发贴之星
日期:2007-12-23 01:06:08开发板块每日发贴之星
日期:2007-12-24 01:05:56开发板块每日发贴之星
日期:2007-12-27 01:05:492008新春纪念徽章
日期:2008-02-13 12:43:03开发板块每日发贴之星
日期:2008-02-14 01:02:08开发板块每日发贴之星
日期:2008-02-15 01:05:13开发板块每日发贴之星
日期:2008-02-16 01:06:48开发板块每日发贴之星
日期:2008-02-17 01:05:20
19#
 楼主| 发表于 2008-2-15 17:46 | 只看该作者

答案G,同答案C,add()编译不成功。。。。

List<? extends B> list_o=new ArrayList<B>();
                List<? extends A> list=list_o;

                //list_array.add("List<A>");
                A a=new A();
                //list.add(a);
                list_o.add(new B());
                System.out.println("list="+list);
                System.out.println("list.get(0)="+list.get(0));

[ 本帖最后由 silver_xie 于 2008-2-15 17:52 编辑 ]

使用道具 举报

回复
论坛徽章:
8
开发板块每日发贴之星
日期:2007-12-23 01:06:08开发板块每日发贴之星
日期:2007-12-24 01:05:56开发板块每日发贴之星
日期:2007-12-27 01:05:492008新春纪念徽章
日期:2008-02-13 12:43:03开发板块每日发贴之星
日期:2008-02-14 01:02:08开发板块每日发贴之星
日期:2008-02-15 01:05:13开发板块每日发贴之星
日期:2008-02-16 01:06:48开发板块每日发贴之星
日期:2008-02-17 01:05:20
20#
 楼主| 发表于 2008-2-15 17:48 | 只看该作者
说实话,就A虽然有warning,还挺好用的。。。。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表