不使用泛型,我们写入集合的元素需要是Object类型,虽然什么类型的元素都可以存入集合,但取出元素使用时我们需要强制转换为元素原来的类型,这就需要我们明确知道每个元素的数据类型,否则很容易引发ClassCastException异常。
使用泛型,先指定数据类型,后期取用不需要再转换。
泛型类的定义语法:
class 类名称<泛型标识,泛型标识,…>{
private 泛型标识 变量名;
……
}
常用的泛型标识:T、E、K、V
泛型类使用语法:
类名<具体的数据类型> 对象名=new 类名<具体的数据类型>();
Java1.7以后,后面的<>中的具体的数据类型可以省略不写
类名<具体的数据类型> 对象名=new 类名<>();
泛型类在创建对象的时候,没有指定类型,将按照Object类型来操作。
泛型类不支持基本数据类型,只能是类类型。(指定整型时,不能用int,要用Integer)
同一泛型类,根据不同的数据类型创建的对象,本质上是同一类型。(泛型类 类类型)
从泛型类派生子类:
子类也是泛型类,子类和父类的泛型类型要一致
class ChildGeneric<T> extends Generic<T>
子类不是泛型类,父类要明确泛型的数据类型
classs ChildGeneric extends Generic<String>
泛型类举例:使用泛型类,编写简单的抽奖器。
1 package FanXing; //泛型类编写
2
3 import java.util.ArrayList;
4 import java.util.Random;
5
6 //创建泛型类ProductGetter(抽奖器)
7 public class ProductGetter<T> {
8 Random random=new Random();
9 //奖品
10 private T product;
11
12 //奖品池
13 ArrayList<T> list=new ArrayList<>();
14
15 //添加奖品
16 public void addProduct(T t) {
17 list.add(t);
18 }
19
20 //抽奖
21 public T getProduct() {
22 product=list.get(random.nextInt(list.size()));
23 return product;
24 }
25 }
1 package FanXing; //测试类
2
3 public class MainClass {
4
5 public static void main(String[] args) {
6 //创建抽奖器对象,指定数据类型(String)
7 ProductGetter<String> stringProductGetter=new ProductGetter<>();
8 String strProduct[]= {"苹果手机","华为手机","咖啡机","扫地机器人"};
9 //给抽奖器中填充奖品
10 for(int i=0;i<strProduct.length;i++) {
11 stringProductGetter.addProduct(strProduct[i]);
12 }
13 //抽奖品
14 String product1=stringProductGetter.getProduct();
15 System.out.println("恭喜您,您抽中了:"+product1);
16
17 System.out.println("---------------------------");
18
19 //创建抽奖器对象,指定数据类型(Integer)
20 ProductGetter<Integer> IntProductGetter=new ProductGetter<>();
21 int intProduct[]= {10000,8000,6000,3000,1000,5000};
22 //给抽奖器中填充奖金
23 for(int i=0;i<intProduct.length;i++) {
24 IntProductGetter.addProduct(intProduct[i]);
25 }
26 //抽奖金
27 int product2=IntProductGetter.getProduct();
28 System.out.println("恭喜您,您抽中了:"+product2);
29 }
30
31 }
运行结果如下: