- 开门见山,先说一个核心的原理,如果a是b的子类,List<a>会是List<b>的子类吗?不是的,在List,Set,Map中都不会是
- 在一个方法中,需要用到带有泛型的集合该怎么办?可以用list<Object>吗?不行,第一点说的就是这个,这个时候应该用的是类型通配符(记为 ?),以下为代码实例:详细的讲解穿插在代码之中
package WildCard; import java.util.ArrayList; import java.util.List; abstract class Shape{ public abstract void draw(Canvas c); } class Circle extends Shape{ @Override public void draw(Canvas c) { System.out.println("圆圆" + c); } } class Rec extends Shape{ @Override public void draw(Canvas c) { System.out.println("方方" + c); } } public class Canvas { public void drawAll(List<? extends Shape> shapes){ // public void drawAll(List<? extends Shape> shapes) // 1.这一句首先用public void drawAll(List<Shape> shapes),然后程序编译出错, // 因为不管是List<Circle>,List<Rec>都不是List<Shape>的子类 // 2.然后用public void drawAll(List<Shape> shapes),程序运行倒是可以 // 运行,就是for循环得酱紫写: // for(Object object : shapes){ // Shape shape = (Shape)Object; // shape.draw(this); // } // 其实就是说"?"通配了所有的类,所以在使用的时候还得强制转化,这也不是最好的选择 // 最好的解决方法是让"?"继承于Shape类 for(Shape shape : shapes){ shape.draw(this); } } public static void main(String args[]){ List<Circle> list = new ArrayList<>(); list.add(new Circle()); list.add(new Circle()); Canvas c = new Canvas(); c.drawAll(list); List<Rec> list1 = new ArrayList<>(); list1.add(new Rec()); list1.add(new Rec()); Canvas c1 = new Canvas(); c1.drawAll(list1); } }
xx
-
甚至,在声明类的时候就可以指定泛型的父类了,代码实例如下,和实现接口的情况类似,当有多喝上限时,类的上限必须位于位于第一位
package WildCard; public class ManyWildCard<T extends Number & java.io.Serializable> { T col; public static void main(String args[]){ ManyWildCard<Integer> manyWildCard = new ManyWildCard<>(); ManyWildCard<Double> manyWildCard1 = new ManyWildCard<>(); // ManyWildCard<String> manyWildCard2 = new ManyWildCard<>(); //// 这一句会报错,因为String不是继承自Number } }
java泛型(3) 类型通配符
猜你喜欢
转载自blog.csdn.net/weixin_39452731/article/details/81415061
今日推荐
周排行