返回类型多态是如何实现的

返回类型多态是怎么实现的?
本帖最后由 owydeai 于 2015-01-25 01:00:42 编辑
新手,很多不懂,麻烦了。

ArrayList<Dog> myLIst = new ArrayList<Dog>();

Dog s = new Dog();
myList.add(s);

Dog b = new Dog();
myList.add(b);

get(0).eat();

当 get(0)时是返回 myList[0],此时myList[0]这个对象引用的类型是Dog,相当于把Dog类型作为Object返回了,因为子类可以替代父类,所以这样是可以的。

但是返回之后它虽然还是指向原来的方向,但是用它来引用Dog中私有且独有(即Object没有的)的方法,编译器会允许吗?

此时get(0)的类型不是Object吗?如果是的话,编译器应该不会允许它使用Dog私有的方法的,是不是这样?

此时,好像就是父类引用怎么能当子类引用来使用的问题了?

ps:新版public E get(int index)  ,旧版Object get( int index),想问下get()具体是怎工作的?
------解决思路----------------------
引用:
定义时指定了Dog类型,ArrayList<Dog> myLIst = new ArrayList<Dog>();
get(0)不再返回Object,而是直接返回的Dog类型对象。
看JDK源码,这是个泛型方法:

    public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }

上面的思想++
不过源码应该是这样的吧(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方法,编译肯定会报错的
------解决思路----------------------
引用:
Quote: 引用:

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

    public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }


从ArrayLIst<Object>取出引用时,引用类型是什么?
从ArrayLIst<Dog>取出引用时,引用类型是什么?

加上取出方法就是Object get( int index)

由类型参数指定,也就是<>中的参数。
从ArrayLIst<Object>取出引用时,就是Object。
从ArrayLIst<Dog>取出引用时,就是Dog。