泛型强化
2022年8月31日
B站黑马教程:点击跳转
p1-概述
java推出泛型钱,List<Object> list,可以存储任意类型对象,但是在使用过程中,需要明确知道数据类型,不然会发生类型转换异常。而且,编译期间不会报错,是运行时出现异常。
代码:
public class MainClass {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("hello");
list.add(1);
list.add(true);
for (int i = 0; i < list.size(); i++) {
Object o = list.get(i);
String str = (String) o;
System.out.println(str);
}
}
}
JDK5引入新特性,泛型在编译时安全检测,可以检测非法的类型。
泛型的本质就是参数类型化,操作的数据类型被指定为一个参数,否则则在编译期间就报错了。
总结:
- 编译期间检查类型
- 减少数据类型转换
p2-泛型类
泛型定义语法
class ClassName <T,E,...>{
private T t;
...
}
常用泛型标识:T、E、K、V
demo
/**
* 泛型类
* @param <T> 泛型参数,在创建对象时指定,由外部使用类时指定
* @author lzc
* @date 2022/08/30
*/
public class Generic<T> {
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
public Generic(T t) {
this.t = t;
}
@Override
public String toString() {
return "Generic{" +
"t=" + t +
'}';
}
}
public static void main(String[] args) {
Generic<String> generic = new Generic<>("hello");
String t = generic.getT();
System.out.println(t);
generic.setT("world");
System.out.println(generic.getT());
}
最大的有点就是代码复用、减少类型转换。如果不指定泛型,默认是Object,不支持基本数据类型。
同一泛型类,根据不同数据类型创建的对象,本质上是同一类型:
public static void main(String[] args) {
Generic<String> stringGeneric = new Generic<>("hello");
Generic<Integer> integerGeneric = new Generic<>(1);
System.out.println("stringGeneric.getClass() = " + stringGeneric.getClass());
System.out.println("integerGeneric.getClass() = " + integerGeneric.getClass());
System.out.println(stringGeneric.getClass() == integerGeneric.getClass());
}
p3-泛型类的使用
/**
* 抽奖,泛型类。包含奖品、奖品池、随机抽取
*
* @author lzc
* @date 2022/08/30
*/
public class ProductGetter<T> {
private Random random = new Random();
/**
* 奖品
*/
private T product;
/**
* 奖品池
*/
private ArrayList<T> list = new ArrayList<T>();
/**
* 获取奖品
*
* @return {@link T}
*/
public T getProduct() {
T t = list.get(random.nextInt(list.size()));
product = t;
return product;
}
/**
* 设置奖品池
*
* @param list 列表
*/
public void setList(ArrayList<T> list) {
this.list = list;
}
}
public static void main(String[] args) {
ProductGetter<String> stringProductGetter = new ProductGetter<>();
ArrayList<String> strings = new ArrayList<>();
String[] strArray = {"苹果手机","华为手机","小米手机"};
strings.addAll(List.of(strArray));
stringProductGetter.setList(strings);
System.out.println("恭喜抽到:" + stringProductGetter.getProduct());
ProductGetter<Integer> integerProductGetter = new ProductGetter<>();
ArrayList<Integer> integers = new ArrayList<>();
integers.addAll(List.of(100,200,300,400,500,600,700,800,900,1000));
integerProductGetter.setList(integers);
System.out.println("恭喜抽到:" + integerProductGetter.getProduct()+"元");
}
p4-泛型类派生子类
子类也是泛型类,子类和父类的泛型类型要一致
class ChildGeneric<T> extends Generic<T>
子类不是泛型类,父类要明确泛型的数据类型
class ChildGeneric extends Generic<String>
Loading...