【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"); } }
然后 说一下 比较有趣的通配符类型,也很简单就是泛型中我们一定要操作对应数据
那么记住一个准则,永远使用超类中的类型去接受子类的类型 (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); } }
不摸着石头过河,难道要在温柔乡睡到天昏地暗。