步骤 1 : 泛型 Generic
不指定泛型的容器,可以存放任何类型的元素 指定了泛型的容器,只能存放指定类型的元素以及其子类
package property; public class Item { String name; int price; public Item(){ } //提供一个初始化name的构造方法 public Item(String name){ this.name = name; } public void effect(){ System.out.println("物品使用后,可以有效果"); } } package collection; import java.util.ArrayList; import java.util.List; import property.Item; import charactor.APHero; import charactor.Hero; public class TestCollection { public static void main(String[] args) { //对于不使用泛型的容器,可以往里面放英雄,也可以往里面放物品 List heros = new ArrayList(); heros.add(new Hero("盖伦")); //本来用于存放英雄的容器,现在也可以存放物品了 heros.add(new Item("冰杖")); //对象转型会出现问题 Hero h1= (Hero) heros.get(0); //尤其是在容器里放的对象太多的时候,就记不清楚哪个位置放的是哪种类型的对象了 Hero h2= (Hero) heros.get(1); //引入泛型Generic //声明容器的时候,就指定了这种容器,只能放Hero,放其他的就会出错 List<Hero> genericheros = new ArrayList<Hero>(); genericheros.add(new Hero("盖伦")); //如果不是Hero类型,根本就放不进去 //genericheros.add(new Item("冰杖")); //除此之外,还能存放Hero的子类 genericheros.add(new APHero()); //并且在取出数据的时候,不需要再进行转型了,因为里面肯定是放的Hero或者其子类 Hero h = genericheros.get(0); } }步骤 2 : 泛型的简写
为了不使编译器出现警告,需要前后都使用泛型,像这样:
List<Hero> genericheros = new ArrayList<Hero>();不过JDK7提供了一个可以略微减少代码量的泛型简写方式
List<Hero> genericheros2 = new ArrayList<>();后面的泛型可以用<>来代替
package collection; import java.util.ArrayList; import java.util.List; import charactor.Hero; public class TestCollection { public static void main(String[] args) { List<Hero> genericheros = new ArrayList<Hero>(); List<Hero> genericheros2 = new ArrayList<>(); } }练习: 支持泛型的ArrayList
借助泛型和前面学习的面向对象的知识,设计一个ArrayList,使得这个ArrayList里,又可以放Hero,又可以放Item,但是除了这两种对象,其他的对象都不能放
答案 :
首先创建一个接口 LOL,不需要在其中声明任何方法 接着让Hero和Item都实现LOL接口 最后,声明一个ArrayList的变量lolList,它的泛型是
List<LOL> lolList = new ArrayList<>();这样在lolList中就即放Hero对象,又放Item对象了。