复制代码

【04】泛型中的桥方法

首先说一下,泛型和CPp 有着本质区别 ,CPP 时进行代码 扩展 ,但是 java 采用的机制,共有超类  Object.

    1.那么需要实现的机制 ,当单纯类型的时候,会生成对应的Object 对象。

    2.当产生继承的时候 ,此时 子类需要继承父类的方法,父类的方法 已经被擦除成Object 类型 ,但是 此时 子类的方法,此时 自己的签名不变 。

package xvy;



class _Parent  <T   >
{
    public void say(T t){
        System.out.println("this is _Parent "+t);
    }
}
class _Son extends _Parent<String>
{
    public void say(String t){
        System.out.println("this is son "+t);
    }
}


public class _brigeMethod {
    public static void main(String []arg){
        _Son son =new _Son();
        _Parent<String > p = son;
        p.say("aaaaa"); 
    }
}
View Code

 

然后 说一下 比较有趣的通配符类型,也很简单就是泛型中我们一定要操作对应数据

那么记住一个准则,永远使用超类中的类型去接受子类的类型 (iterator 迭代器 Collection 容器接口)

package xvy;
import java.util.Collection;
import java.util.Iterator; 

class Stack<E>{
    public Stack(){

    }
    public void push(E e)
    {}
    public void pushAll(Iterable<E> iter ){
        for(E e: iter){
            push(e);
        }
    }
    public void pushAll01(Iterable<? extends E> iter){
        for(E e: iter){
            push(e);
        }
    }
    public E pop(){
        return null;
    }
    public void popAll(Collection<E> iter){
        iter.add(pop());
    }
    public void popAll01(Collection<? super E> iter){
        iter.add(pop());
    }

}
public class MethodTest {
    public static void  main(String []arg) {
        Stack<Number> s = new Stack<>();
        Iterable<Integer> iter = null;
        s.pushAll01(iter);
        Collection<Object> c = null;
        s.popAll01(c);

    }
}
View Code

 

posted @ 2018-11-23 22:18  pg633  阅读(140)  评论(0编辑  收藏  举报