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<>();
         
    }
}
相关文章
相关标签/搜索