示例 1 : 不使用泛型java
不使用泛型带来的问题
ADHero(物理攻击英雄) APHero(魔法攻击英雄)都是Hero的子类
ArrayList 默认接受Object类型的对象,因此全部对象均可以放进ArrayList中
因此get(0) 返回的类型是Object
接着,须要进行强制转换才能够获得APHero类型或者ADHero类型。
若是软件开发人员记忆比较好,能记得哪一个是哪一个,仍是能够的。 可是开发人员会犯错误,好比第20行,会记错,把第0个对象转换为ADHero,这样就会出现类型转换异常code
package generic; import java.util.ArrayList; import charactor.ADHero; import charactor.APHero; public class TestGeneric { public static void main(String[] args) { ArrayList heros = new ArrayList(); heros.add(new APHero()); heros.add(new ADHero()); APHero apHero = (APHero) heros.get(0); ADHero adHero = (ADHero) heros.get(1); ADHero adHero2 = (ADHero) heros.get(0); } }
示例 2 : 使用泛型对象
使用泛型的好处:
泛型的用法是在容器后面添加
Type能够是类,抽象类,接口
泛型表示这种容器,
只能存放APHero,ADHero就放不进去了。
package generic; import java.util.ArrayList; import charactor.APHero; public class TestGeneric { public static void main(String[] args) { ArrayList<APHero> heros = new ArrayList<APHero>(); //只有APHero能够放进去 heros.add(new APHero()); //ADHero甚至放不进去 //heros.add(new ADHero()); //获取的时候也不须要进行转型,由于取出来必定是APHero APHero apHero = heros.get(0); } }
示例 3 : 子类对象开发
假设容器的泛型是Hero,那么Hero的子类APHero,ADHero均可以放进去
和Hero无关的类型Item仍是放不进去get
package generic; import java.util.ArrayList; import property.Item; import charactor.ADHero; import charactor.APHero; import charactor.Hero; public class TestGeneric { public static void main(String[] args) { ArrayList<Hero> heros = new ArrayList<Hero>(); //只有做为Hero的子类能够放进去 heros.add(new APHero()); heros.add(new ADHero()); //和Hero无关的类型Item仍是放不进去 //heros.add(new Item()); } }
示例 4 : 泛型的简写编译器
为了避免使编译器出现警告,须要先后都使用泛型,像这样:编译
ArrayList<Hero> heros = new ArrayList<Hero>();
不过JDK7提供了一个能够略微减小代码量的泛型简写方式class
ArrayList<Hero> heros2 = new ArrayList<>();
后面的泛型能够用<>来代替import
package generic; import java.util.ArrayList; import charactor.Hero; public class TestGeneric { public static void main(String[] args) { ArrayList<Hero> heros = new ArrayList<Hero>(); //后面能够只用<> ArrayList<Hero> heros2 = new ArrayList<>(); } }