Java笔记-泛型

Java笔记-泛型

引入

由于之前不能够对加入到集合中的元素进行约束,可能会出现类型转换异常ClassCastException的异常。(不安全💔)

在遍历集合的时候,需要类型转换,数据量一大,效率就低。(效率低💔)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@SuppressWarnings({"all"})
public class generic01 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(new Dog("tom", 3));
list.add(new Dog("jack", 5));
list.add(new Dog("lily", 1));

list.add(new Cat("kitty", 4));

for (Object o : list) {
System.out.println(((Dog) o).getName() + "-" + ((Dog) o).getAge());
}
}
}

image-20210511151918974

使用泛型后,通过对存入到集合中元素进行类型约束,可以自动检查添加的元素类型是否是约定的类型;

同时在遍历时,不需要再进行转型,使得效率提高🧡🧡。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class generic01 {
public static void main(String[] args) {
ArrayList<Dog> list = new ArrayList<Dog>();
list.add(new Dog("tom", 3));
list.add(new Dog("jack", 5));
list.add(new Dog("lily", 1));

// list.add(new Cat("kitty", 4)); //使用泛型后,使用这条语句,会提示错误

for (Dog o : list) {
System.out.println(o.getName() + "-" + o.getAge());
}
}
}

如果将上面的那行代码取消注释,试图向list中添加Cat对象时,idea将会提示我有语法错误,这正体现出使用泛型的一个好处就是类型进行【约束】,保证了代码的安全性。

❌错误提示:

image-20210511152257920

是什么?

image-20210511153557534

image-20210511153709638

在编译时就确定E是什么类型;

使用

image-20210511154016796

1、泛型中指定的数据类型必须是应用类型,不可以是基本数据类型(short\int\long\byte\float\double\boolean\char);

2、指定泛型后,传入的类型可以是指定的类型,也可以是其子类型;

3、泛型的使用形式

下面两种都可以,推荐使用第二种,更加简洁。

1
2
3
ArrayList<Integer> list1 = new ArryList<Integer>();
ArrayList<Integer> list2 = new ArryList<>();
ArrayList list3 = new ArryList(); //不使用泛型,默认是Object

自定义泛型/泛型接口/泛型方法

1
2
3
4
5
6
7
8
9
10
11
12
//泛型
class 类名<T,R...>{
成员
}

//泛型接口
interface 接口名<T,R...>{
}

//泛型方法
修饰符 <T,R...> 返回类型 方法名(参数列表){
}

image-20210511165125110

image-20210511165242210

image-20210511170459084

image-20210511172117159


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!