up,楼主贴子有点好,
new Collection[0] instanceof Collection,你这句话是不是说collection不是Collection[0]的“顶端”,没有一个共同的端点,所以不通过

解决方案 »

  1.   

    oxv(花生壳)
    我的表述意思是Collection[] 和 Collection完全是两个不同的类,之间没有继承关系。
      

  2.   

    楼主的想法不错,不过我是这么理解的
    Object是所有类的根,即所有对象都是从属于Object,包括数组(数组也可以看作是一个对象,尽管是多个对象的聚合),Object从某种意义上说就是任意类型,相当于C或VB或delphi的variant类型(可变类型,即该类型可以转换为任意一种类型,比如int或char等等),所以,也可以这样来看这个问题:
    Object obj;
    obj = new Object[2]; //这样是没问题的,obj相当于是可变类型(该对象可以变为任意需要的对象)
    而以下的
    Collection col;
    col = new Collection[2]; //这样是不行的,因为col是具体指定的类型Collection,是不可变的Object可以派生出Object[],所以
    Object<--Object[]
    而Collection不能派生出Collection[],所以
    Collection<-\-Collection[]这样的对应关系应该是不合理的
    Object[]<--Collection[]<--HashSet[]
      |          |             |
      V          V             V
    Object<--Collection<--HashSet应该是
    Object[]<--Collection[]<--HashSet[]
           \        |        /    
             \      |      /    
               \    |    /
                 Object<--Collection<--HashSet
      

  3.   

    楼主错了
    new Object[]{} instanceof Object
    可以分成两步来理解,首先是 new Object[]{} ,创建一个Object数组,其中的每一个元素都可以是一个Java对象,根据Java的多态,Object类是Java的根类,所以任何对象都可以放到这个数组中
    其次,在Java中数组本身也是一个对象,因此它也是Object类的对象,这样 instanceof Object 就返回 true 了
      

  4.   

    很有意思的帖子!我顶! 不过既然Object 是终极超类那么所有的对象都可以instanceof Object返回true 也不奇怪了!:)
      

  5.   

    Java 里所有的对象都是extends Object,不管你是数组还是什么东东,包括int,float,char这些基本类型都是,用过java的反射技术就更能理解这点http://www.javayou.com/showlog.jspe?cat_id=3&log_id=369
      

  6.   

    包括int,float,char这些基本类型都是? 这个不是吧
      

  7.   

    to qybao(阿宝)
        我觉得你关于可变的概念是错误的。Object引用可以指向任何对象并不是因为Object“可变”--也就是你说的“相当于C或VB或delphi的variant”,而是因为一切对象皆继承自Object,根据java的多态性Object引用可以指向任何对象。所以,你认为Collection引用“不可变”是错误的。因为Collection c=new HashSet()成立,照你这么说Collection引用又变成“可变”的咯?事实上在java中“可变”是另一个概念,和本贴讨论的问题无关。to  jimshen(jimshen) 
        你没有指出我错在哪里。to liusoft(凤梨罐头)
        基本类型就是基本类型,基本类型不extends Object,因为基本类型不是对象。不果基本类型的包装类继承自Object。
      

  8.   

    to alienbat(亡灵法师) 
    我只是说可以这样去看这个问题,而且我的例子也提到了这种“可变”是一种派生关系Collection c=new HashSet()成立,照你这么说Collection引用又变成“可变”的咯?
    在这种场合可以说Collection可变,因为Collection可以派生出HashSet,但Collection的可变毕竟是有局限的,只能“变为”实现过该接口的类(即由其派生出来的类),从这里可以看出,任何父类(包括接口)都“可变”(实例化)为子类,而Object是所有类的根,所以任何对象都是Oject的实例,除此之外,除非符合继承(或接口)实现关系,否则是未必就是满足instanceof,所以
    Object[]<--Collection[]<--HashSet[]
      |          |             |
      V          V             V
    Object<--Collection<--HashSet
    这个本来就不存在一一对应的关系。我之所以联想到Object和variant,是因为Object是所有类的根,可以实例化为任何子类,这和variant可以变成各种类型有点相似,其他语言里有且只有variant(当然C++的CObject暂不讨论)可变类型,而java里有且只有Object可派生出所有类
      

  9.   

    qybao(阿宝)
    我说过你的概念是错的。到现在为止你的概念还是错的。
    java中引用没有可变这一说法,只有多态。一个引用,它的引用类型在声明的时候就定下来了,永远也不会再变。至于Object可以作为任何对象的引用、Collection可以作为HashSet的引用,那是因为多态的关系。再强调一下“可变”和“多态”完全是两码事。你所说的“可变”,在其他语言中确实有。比如说javaScript中的Var。但是Var之所以可以指向任何对象,那是因为javaScript是一种弱类型检查的语言,引用不要求与类型绑定。而java是一种强类型检查的语言,引用要求与类型绑定。所以,把“可变”这个概念用于java引用是完全错误的。更何况,在java中,“可变”有它另外的含义。
      

  10.   

    to alienbat(亡灵法师) 
    我承认我的这种“借用”其他语言的概念来说明问题是有点欠妥,但我的本意只是想解释得通俗一些,instanceof是用于判断一个对象(数组)是否是一个类(数组)的实例,且instanceof是会不断向上追溯根源的,当追溯到对象的祖宗类与判断的类一致时将返回true,很显然,java里所有类都继承于Object,任何对象不断向上追溯最终必将到达根类Object,所以xxx instanceof Object返回都是true是可以理解的,而new Collection[0] instanceof Collection 这个之所以不合法是因为instanceof的前后必须是对等的,即前者是对象数组,后者必须是类数组(Object除外,因为数组也是对象),而
    Collection [] a=new Collection[1];
    HashSet [] b=new HashSet[1];
    System.out.println(b instanceof Collection[]);这个之所以返回true是因为HashSet[]和Collection[]是符合类的派生关系,即Collection[]可以派生HashSet[],所以HashSet[]的实例也是Collection[]的实例,而如果改为String[] b=new String[1];很显然b instanceof Collection[]将返回false,因为Collection[]是不能派生出String[],而如果b instanceof Object[]又返回true,由于Object是所有类的根,所以Object[]也是所有对象数组的根,正如楼主说的
    Object[]<--Collection[]<--HashSet[]Object<--Collection<--HashSet
    两个继承体系是并行的,而由于数组也是对象,所以Object[]也继承于Object,也就是
    Object[]<--Collection[]<--HashSet[]
      |
      V
    Object<--Collection<--HashSet
    当调用instanceof方法时,将沿着相应的派生关系路径查找,无论是从类路径还是类数组路径查找,最终都会找到Object。之前借用其他语言的“可变”概念来说明是不合理的,java里“可变”的概念我好像没看到过,希望alienbat (亡灵法师) 能在这里也做个说明。
      

  11.   

    我还以为讨论什么呢,其实数组也是object,如果数组也是基本类型直接访问内存不加控制,怎么会抛出越界异常来,早就非法访问内存了。
    其实唯一有点搞头的地方是A extends B的时候,A[] Vs B[],A[][] vs B[][]以及
    A[] vs B[][]还有A[][] vs B[]的关系,搞清楚这个你就彻底明白java数组的概念
      

  12.   

    to qybao(阿宝)...而new Collection[0] instanceof Collection 这个之所以不合法是因为instanceof的前后必须是对等的,即前者是对象数组,后者必须是类数组
    --------------------------------------------------------------
    你错了。这里之所以不合法是因为Collection[0]类与Collection类不存在任何继承关系,而不是什么“对等”。两个类之间是否存在继承关系是在编译期就确定下来的东西,所以这个错误是个编译错误。此处有必要说一下instanceof操作符。instanceof操作符用于确定一个类的运行期类型,注意了是运行期--也就是说,HashSet instanceof Collection返回true,是在运行期决定的。但是instanceof语句能够通过编译的前提是两端的类有继承关系,而有否继承关系是在编译期决定的。----------------------
    ...所以HashSet[]的实例也是Collection[]的实例,而如果改为String[] b=new String[1];很显然b instanceof Collection[]将返回false,因为Collection[]是不能派生出String[],
    -----------------------
    b instanceof Collection[]不会在运行时返回false,而会在编译时报错。因为String[]和Collection[]没有继承关系。你对数组继承树的概念是正确的。其他某些概念则有错误。
    在java中“可变”指的是一个对象在建立后数据可否改变。
      

  13.   

    数组都继承自Object,因为数组里的元素没有实例化之前是null的,什么也没有。Collection[] instanceof Collection当然是false了,可是你如果用Collection[i] instanceof Collection就成true了
      

  14.   

    umbrella1984(迈克尔·老鬼) 不懂就不要胡说八道。
    怎么java版的人技术那么差。都4个三角了连基础概念都没弄清楚。怎么搞的...
      

  15.   

    呵呵,搂主骂人从来都是不客气的。佩服佩服我想 qybao(阿宝) 其实是懂得,只是对于概念的确存在张冠李戴的想法。
    另qybao(阿宝) 怎么讲楼主的图给改了?本来是
    Object[]<--Collection[]<--HashSet[]
      |
      V
    Object<--Collection<--HashSet怎么变成这样了
    Object[]<--Collection[]<--HashSet[]
      |          |             |
      V          V             V
    Object<--Collection<--HashSet
    而且我还觉得qybao(阿宝) 的表达有问题:
    Object[]<--Collection[]<--HashSet[]
           \        |        /    
             \      |      /    
               \    |    /
                 Object<--Collection<--HashSet
    其实Collection[],HashSet[]并不是直接从Object上继承而来的啊,应该是楼主说的那样才对
      

  16.   

    >因此任何东西xxx instanceof Object都返回true对不起,指正一下,null instanceof Object或者任何东西都返回false
      

  17.   

    搂住,或者其他人,顺便思考一下吧,任何数组的实例XXX[] a, 都满足a instaceof Object[]?
      

  18.   

    alienbat(亡灵法师) 啊,原来我理解错了,不好意思啊,不过这个我确实不太明白,看来要好好补补基础知识了,上面的打错了,应该是
    Collection[i] instanceof Object成true了
      

  19.   

    >上面的打错了,应该是
    >Collection[i] instanceof Object成true了原文>Collection[i] instanceof Collection就成true了有什么问题?
      

  20.   

    new Collection[i] instanceof Collection当然是false,(new Collection[10])[0] instanceof Collection当然true,除非null
      

  21.   

    to亡灵法师:java中引用没有可变这一说法,只有多态。一个引用,它的引用类型在声明的时候就定下来了,永远也不会再变。
    ----------------------------------谁告诉你的??
    谁说引用不可变。JAVA的底层就是利用改变引用的涵盖地址来实现“多态”的
      

  22.   

    to qazxsw1982103(c++)
    首先,我说的是“引用类型在声明的时候就定下来了,永远也不会再变”。请你看清楚类型二字。
    其次,看到“JAVA的底层就是利用改变引用的涵盖地址来实现“多态”的”这句话,我本想说你没有搞清楚引用和对象本身的区别;但是这句话含混不清,所以我也不能这么说。请说明这句话的出处,或者还是你自己想出来的?
    -----------------------to shine333(enihs)
    我真想不通来,你都两颗星了,为何如此基本的概念还搞错?而且还以非常确定的口吻说出完全错误的结论,真令人惊讶。----new Collection[i] instanceof Collection当然是false,    (new Collection[10])[0] instanceof Collection当然true,除非null你随便拿个编译器试试看吧。new Collection[i] instanceof Collection这句话根本就通不过编译。对此我的解释就在顶上。
    另外对你说的请我思考一下“任何数组的实例XXX[] a, 都满足a instaceof Object[]?”的问题,我的回答是我发帖的时候就思考过了并已做出阐述,答案是Yes。可以得出结论,同维的对象数组符合它们单体的继承树。我是不是该结贴了?来回帖的人的说法一个比一个错误。JAVA版的整体水平真令我失望。
      

  23.   

    我本想说你没有搞清楚引用和对象本身的区别;但是这句话含混不清,所以我也不能这么说
    ----------------------------------------你已经说了
    我像在听笑话。
    刚才的确没看清你说的是‘类型’。
    凡是对对象模型有过研究的人都知道“JAVA的底层就是利用改变引用的涵盖地址来实现“多态”的”。另外,水平的高低与星星多少无关,
    就像你5个三角也不过如斯    
      

  24.   

    帅哥,我承认忘了加括号但是,你也别那么确定,尝试一下,double[], int[]再说吧:D
      

  25.   

    ((Object)(new Collection[i])) instanceof Collection
      

  26.   

    我原先的表示的可能太草率了,没有解释清楚,new Collection[i] instanceof Collection当然是false,愿意是想说,任何XXX数组(XXX!=Object), 有XXX[] a, ((Upcasting) a) instanceof XXX都false,这个是绝对。我想这次没有忘了什么吧
      

  27.   

    在补充一下,Upcasting 也需要满足条件,导致((Upcasting) a的类型与XXX有直系亲缘关系
      

  28.   

    好像越描越黑,废话那么多,
    Upcasting直接就改称(Object),而且,想了半天好像只有转型成Object,他们才会成为直系亲属
      

  29.   

    to shine333(enihs)
    不管你upcast还是downcast都是没有办法改变instanceof取得的值的。instanceof检测的是对象的实际类型,而不是它的引用的类型。to qazxsw1982103(c++) -----凡是对对象模型有过研究的人都知道“JAVA的底层就是利用改变引用的涵盖地址来实现“多态”的”请你不要对我说“研究、对象模型”这样的大词。敢问你哪个大学毕业的?拿名词来吓唬我,你是找错人了。首先告诉你一点,常识是:不同的编程语言对对象模型的实现是可以不同的。所以“研究过对象模型”并不等于“对对象模型有过研究的人”就了解java的多态。其次,不知道你有没有看过《深入java虚拟机》这本书。不好意思我看过,而其中并没有“JAVA的底层就是利用改变引用的涵盖地址来实现“多态”的”这种说法。你在看笑话么?我倒觉得你像个笑话。菜鸟也许认为上面这句话很高深,但我认为是狗屁。最后,三角和星星的数量在概率上能够代表一个人的技术水平。至少在你和我身上已经验证了。
      

  30.   

    JAVA版的整体水平真令我失望
    ------------------------------
    有你就有希望常识是:不同的编程语言对对象模型的实现是可以不同的
    -------------------------------
    谢谢你告诉我哈 :D
    敢问你哪个大学毕业的?拿名词来吓唬我,你是找错人了。
    ----------------------------------
    谁敢吓唬你?知道你是大学毕业,果然了得《深入java虚拟机》
    -----------------------
    没,只看过《inside the java virtual machine》别激动,真的没打算和你争什么。有那时间不如拉个屎
      

  31.   

    >to shine333(enihs)
    >不管你upcast还是downcast都是没有办法改变instanceof取得的值的。instanceof检测的是>对象的实际类型,而不是它的引用的类型。所以我说“实际类型”为Collection[]的某个实例 instanceof Collection类型是永远错误的另外,针对你的>另外对你说的请我思考一下“任何数组的实例XXX[] a, 都满足a instaceof Object[]?”的问题,我的回答是我发帖的时候就思考过了并已做出阐述,答案是Yes。可以得出结论,同维的对象数组符合它们单体的继承树。你有没有,明确回答,有没有,尝试过Object a = new double[10];
    System.out.println(a instanceof Object[]);而且,如果一定要咬文嚼字的话,我问问题的时候可从来没有说过对象数组,这个条件可是你自己附加的>请你不要对我说“研究、对象模型”这样的大词。敢问你哪个大学毕业的?拿名词来吓唬我,你是找错人了。
    >最后,三角和星星的数量在概率上能够代表一个人的技术水平。至少在你和我身上已经验证了。
    我说过了
    >还有,星星三角并不代表什么,>闻道有先后,术业有专攻,如是而已不要仗着自己比人家多了那么4000-多分就瞧不起人家。分数高的人也会有求于分数低的人的时候。我在楼上还犯了编译期错误那么低级的错误。>请你不要对我说“研究、对象模型”这样的大词。敢问你哪个大学毕业的?拿名词来吓唬我,你是找错人了。敢问阁下师从何处?>其次,不知道你有没有看过《深入java虚拟机》这本书。不好意思我看过,而其中并没有“JAVA的底层就是利用改变引用的涵盖地址来实现“多态”的”这种说法。你在看笑话么?我倒觉得你像个笑话。菜鸟也许认为上面这句话很高深,但我认为是狗屁。真有本事你看书干嘛呢?你有没有作为那次运算的某个电子参与其中?要知道,毛 主席他老人家教导我们.......好了玩笑开够了,也有点过分了,回到正题,我跑到这里,只想指出这么几点:
    1 null 在编译期可以代表任何对象类型,但在运行期却什么也不是
    2 任何一个数组,其类型都不是组成这个数组元素的类型或者元素的子类型,当然Object除外
    3 原生类型的数组,是Object的子类型,却不是Object[]的子类型如果这3点中有差错,请马上发短消息给我,或者[email protected],无论是谁,只要能够指出,立马高分相赠,绝对从心底表示感激
      

  32.   

    向楼主表示一下歉意,关于Collection[]/Collection的地方,我和你的观点是一致的我漏看了> 回复人: alienbat(亡灵法师) ( ) 信誉:105  2004-7-13 23:32:48  得分: 0  
     
     
       
    oxv(花生壳)
    我的表述意思是Collection[] 和 Collection完全是两个不同的类,之间没有继承关系。
      

  33.   

    另外,再补充一下>我的表述意思是Collection[] 和 Collection完全是两个不同的类,之间没有继承关系这个也适用于Collection[][]和Collection[]之间
      

  34.   

    但是一切到了Object这边有不一样了Collection[][] 是Object[][]->Object[]->Object但double[][]是Object[]->Object依次类推
      

  35.   

    To shine333(enihs) 
    我不是什么电子,没直接参与过运算。不过我本专业倒是有数字电路、汇编和单片机,所以本人对计算机还是比较了解深入的。恩,切入正题。你总结的三条东西是对的。Collection[][] 是Object[][]->Object[]->Objectdouble[][]是Object[]->Object我验证了一下,这也是对的。不过,Object[][]->Object[]->Object我倒是真的没有想到过。我在本书上看到过,说同维对象数组可以有继承关系。另外,原生数组我也没有仔细考虑过。我把数组和Collection容器类比的太多了,其实数组和Collection还是有很大区别的。
    shine333(enihs).感谢你的认真。真理越辩越明。to qazxsw1982103(c++)拉屎去厕所,别来这里。祝你拉屎愉快。