现在是2020年9月21日15:47:18,继续我的Java API的学习分享。
本次原本想先讲集合类,再顺带地讲一下泛型这个Java特性的。但是后来想了想,这两个知识点是相互独立的,而且先讲泛型有利于对集合的源码学习的测试,所以最终打算先讲讲泛型。这是为集合知识的讲解做个铺垫,在分享集合知识也是对泛型知识应用的巩固。
Java泛型(Generic)
- 什么是泛型?泛型有何用处?
Java泛型(generics)是JDK 5中引入的一个新特性泛型提供了编译时类型安全监测机制,该机制允许程序员在编译时监测非法的类型。说白了,泛型就是让程序开发者自己规定某类中对哪个引用类型进行操作,如果规定后在编译期间发现不是对规定的引用类型进行操作,那么将在编译时报错。
注意:这里必须强调泛型中规定的数据类型必须是引用数据类型,不能是基本数据类型。这也是为什么需要包装类来包装八大基本数据类型的原因之一。
package cn.drgn.javase.api.collection_map.generic;
import java.util.*;
/**
* Create by Drgn on 2020/9/19 23:58
*/
public class GenericsTest {
public static void main(String[] args) {
// 定义了一个List集合,并且规定该集合中的元素必须是String类型
// 对应的引用类型紧跟变量的数据类型后面,并且使用尖括号<>隔开,
// 即:数据类型<引用类型> 引用 = new 数据类型<引用类型>();
List<String> list = new ArrayList<String>();
//自动类型推断机制:JDK8之后可以省略new之后<>中的类型。
Map<String, String> map = new HashMap<>();
}
}
- 自定义泛型
(1)先定义一个动物类:Animal
package cn.drgn.javase.api.collection_map.generic.custom;
/**
* Create by Drgn on 2020/9/20 23:32
* 动物类,作为泛型要指定的引用类型
*/
public class Animal {
// 构造方法
public Animal(){}
public Animal(String name) {
this.name = name;
}
// 动物名字
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 重写了toString方法
@Override
public String toString() {
return name;
}
}
(2)再定义一个工厂类:Factory
package cn.drgn.javase.api.collection_map.generic.custom;
/**
* Create by Drgn on 2020/9/20 23:34
* 工厂类,用于生产产品
* 这里使用了自定义的泛型,使用<T>来表示该类可以使用泛型来限制要操作的对象。
* 这里的T这是一个标记符号,可以换成任意的标号,常见使用T,E,V,K等做标记。
* 当在创建该类对象,并指定泛型的类型时,T将被具体指定的类名所代替。
*/
public class Factory<T> {
// 构造方法
public Factory(T t){
this.t = t;
}
// 成员变量
private T t;
// 工厂生产方法
public void produce(){
System.out.println("生产了" + t);
}
// 获得产品
public T getProduct(){
return t;
}
}
(3)生产测试类:ProduceTest
package cn.drgn.javase.api.collection_map.generic.custom;
/**
* Create by Drgn on 2020/9/20 23:38
*/
public class ProduceTest {
public static void main(String[] args) {
// 创建了Animal对象,名字是狗
Animal a = new Animal("狗");
// 创建了Factory对象,并使用泛型规定只能生产Animal类对象
Factory<Animal> factory = new Factory<>(a);
// 调用方法,完成Animal的生产
factory.produce();// 测试结果:生产了狗
}
}
好的,泛型这个Java特性其实还是很简单的,希望上面的讲解对读者有所帮助。有错误,请多多指正,谢谢阅读。