本帖最后由 owydeai 于 2015-01-25 01:00:42 编辑

解决方案 »

  1.   

    返回类型不是Object吗?这个类型怎么能调用Dog独有的方法?
      

  2.   

    定义时指定了Dog类型,ArrayList<Dog> myLIst = new ArrayList<Dog>();
    get(0)不再返回Object,而是直接返回的Dog类型对象。
    看JDK源码,这是个泛型方法:    public E get(int index) {
            rangeCheck(index);        return elementData(index);
        }
      

  3.   

    以前是这样:Object get( int index);  那时是不是需要强制类型转换?
      

  4.   

    上面的思想++
    不过源码应该是这样的吧(jdk1.5及以上的):
    public E get(int index) {
    RangeCheck(index); return (E) elementData[index];
        }ArrayList<Dog> myLIst = new ArrayList<Dog>();从这可以看出lz用的是5.0及以上的版本。当你new一个对象时,你已经为ArrayList的泛型E赋值了Dog,在get时是会进行强制类型转化的((E) elementData[index];)。  不过有一点不是太明白lz这样写get(0).eat();不报错??针对你说的旧版本的旧版Object get( int index);  (5.0之前的)
    源码基本类似,不过没有泛型,也没有强制类型转换,返回的就是一个Object类型。
    源码:public Object get(int index) {
    RangeCheck(index); return elementData[index];
        }注:在jdk新版本中如果未进行泛型设置时,ArrayList myLIst = new ArrayList();  相当于ArrayList<Object> myLIst = new ArrayList<Object>();       
     
    那么如果get返回的是Object类型,向下调用eat方法,编译肯定会报错的
      

  5.   


    从ArrayLIst<Object>取出引用时,引用类型是什么?
    从ArrayLIst<Dog>取出引用时,引用类型是什么?加上取出方法就是Object get( int index)
      

  6.   

    以前是这样:Object get( int index);  那时是不是需要强制类型转换?
    JDK1.5之前是要强制转换的。
      

  7.   


    从ArrayLIst<Object>取出引用时,引用类型是什么?
    从ArrayLIst<Dog>取出引用时,引用类型是什么?加上取出方法就是Object get( int index)
    由类型参数指定,也就是<>中的参数。
    从ArrayLIst<Object>取出引用时,就是Object。
    从ArrayLIst<Dog>取出引用时,就是Dog。
      

  8.   

    @t_jl1979 @FirstHelloWorld 假设取出方法还是以前的那种;Object get( int index),即在JDk 1.5之前的话。从ArrayLIst<Object>取出引用时,引用类型是什么?
     从ArrayLIst<Dog>取出引用时,引用类型是什么?
      

  9.   

     1.5之前不支持这种写法。
    ArrayList myLIst = new ArrayList();
    那么只能是Object。
      

  10.   

    上面的思想++
    不过源码应该是这样的吧(jdk1.5及以上的):
    public E get(int index) {
    RangeCheck(index); return (E) elementData[index];
        }ArrayList<Dog> myLIst = new ArrayList<Dog>();从这可以看出lz用的是5.0及以上的版本。当你new一个对象时,你已经为ArrayList的泛型E赋值了Dog,在get时是会进行强制类型转化的((E) elementData[index];)。  不过有一点不是太明白lz这样写get(0).eat();不报错??针对你说的旧版本的旧版Object get( int index);  (5.0之前的)
    源码基本类似,不过没有泛型,也没有强制类型转换,返回的就是一个Object类型。
    源码:public Object get(int index) {
    RangeCheck(index); return elementData[index];
        }注:在jdk新版本中如果未进行泛型设置时,ArrayList myLIst = new ArrayList();  相当于ArrayList<Object> myLIst = new ArrayList<Object>();       
     
    那么如果get返回的是Object类型,向下调用eat方法,编译肯定会报错的
    1.8的jdk是我上面这么写的,不知道你看的是1.x的。各个版本的jdk偶尔会有微小的变化。
      

  11.   

     1.5之前不支持这种写法。
    ArrayList myLIst = new ArrayList();
    那么只能是Object。 
    看得书太烂......   head First java           把我都看迷糊了