什麼是 泛型? 示例 1 : 不使用泛型 不使用泛型帶來的問題 ADHero(物理攻擊英雄) APHero(魔法攻擊英雄)都是Hero的子類 ArrayList 預設接受Object類型的對象,所以所有對象都可以放進ArrayList中 所以get(0) 返回的類型是Object 接著,需要進行強制 ...
什麼是 泛型?
示例 1 : 不使用泛型
不使用泛型帶來的問題
ADHero(物理攻擊英雄) APHero(魔法攻擊英雄)都是Hero的子類
ArrayList 預設接受Object類型的對象,所以所有對象都可以放進ArrayList中
所以get(0) 返回的類型是Object
接著,需要進行強制轉換才可以得到APHero類型或者ADHero類型。
如果軟體開發人員記憶比較好,能記得哪個是哪個,還是可以的。 但是開發人員會犯錯誤,比如第20行,會記錯,把第0個對象轉換為ADHero,這樣就會出現類型轉換異常
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還是放不進去
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提供了一個可以略微減少代碼量的泛型簡寫方式
ArrayList<Hero> heros2 = new ArrayList<>();
後面的泛型可以用<>來代替
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<>();
}
}