Java自學-泛型 集合中的泛型

什麼是 泛型?

示例 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<>();
         
    }
}
相關文章
相關標籤/搜索