示例 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<>(); } }