1. 背景
泛型技术诞生之前(JDK5以前),创建集合的类型都是Object 类型的元素,存储内容没有限制,编译时正常,运行时容易出现ClassCastException 异常。
public class Test {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("java");
list.add(100);
list.add(true);
for(int i = 0;i <list.size();i++) {
Object o = list.get(i);
String str = (String)o;
System.out.println(str);
}
}
}
输出:
java
Exception in thread “main” java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at com.chengyu.junit.Test.main(Test.java:18)
2. 泛型概念
JDK5 中引入泛型,从而可以在编译时检测是否存在非法的类型数据结构。
其本质就是参数化类型,可以用于类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
public static void main(String[] args) {
ArrayList<String> strList = new ArrayList<String>();
strList.add("java");
strList.add("C#");
for(int i = 0;i < strList.size();i++) {
String str = strList.get(i);
System.out.println(str);
}
}
3. 泛型类
3.1 定义与调用
定义类时设置泛型,该泛型可用于类中的属性或方法中,调用该泛型类时,指定具体类型;
// 调用泛型类
public class GenericTest {
public static void main(String[] args) {
Generic<String> strGen = new Generic<>("a");
String key = strGen.getKey();
System.out.println(key);
}
}
// 定义泛型类
// @param <T> 使用类时指定
class Generic<T>{
private T key;
public Generic(T key) {
this.key = key;
}
public T getKey() {
return key;
}
public void setKey(T key) {
this.key = key;
}
@Override
public String toString() {
return "GenericTest [key=" + key + "]";
}
}
3.2 注意
1)调用泛型类时未定义类型,则会按照Object 类型处理;
2)调用时分别指定不同类型,但本质都是Object 类型;
3)泛型不支持基本数据类型;
4)泛型类的成员方法不可以用static 修饰(泛型方法可以)。
3.3 使用
需求:抽奖活动,但抽奖内容没有确定,可能都是现金,也可能都是物品
public class ProductGetterTest {
public static void main(String[] args) {
// 抽物品
ProductGetter<String> strProductGetter = new ProductGetter<>();
String[] str = {
"手机","电视","洗衣机"};
for(int i = 0; i < str.length; i ++ ) {
strProductGetter.addProduct(str[i]);
}
String strProduct = strProductGetter.getProduct();
System.out.