一、前言
1.什么是泛型
泛型(Generics)是一种编程语言特性,用于支持类型参数化。具体而言,它允许用户在定义类、接口和方法时使用一个或多个类型参数,这些参数表示一种或多种类型而非具体的类型。在使用泛型时,可以使用任何符合泛型约束的类型作为类型参数,使得代码重用性更高,更安全,更可读。泛型在许多现代编程语言中得到广泛的支持和应用
2.为什么要使用
早期Java是使用Object来代表任意类型的,但是向下转型有强转的问题,这样程序就不太安全,有了泛型以后。
1.代码更加简洁【不用强制转换】
2.程序更加健壮【只要编译时期没有警告,那么运行时期就不会出现ClassCastException异常】
3.可读性和稳定性【在编写集合的时候,就限定了类型】
二、泛型的使用场景
1.泛型容器类
使用List、Map等数据结构,通过泛型,可以使用不同类型的元素进行存储和操作,并且使用泛型可以将运行时异常转换为编译期异常。
没有泛型规定容器
List list=new ArrayList(); list.add(1); list.add(2); list.add(3); list.add(4); list.add("c"); for (Object objects : list) { int num=(int) objects; if(num%2==1) { System.out.println(num); } }
打印结果:编译期没有异常,运行异常
泛型规定容器后
可以帮我们解决编译期的错误,尽早的发现问题。
2.泛型接口类
在做项目的时候,不管是业务逻辑层还是数据访问层,我们定义用于增删改查的所有方法,存在大量冗余的代码。因此为了使我们的项目更为简洁,易于维护,泛型接口就派上用场了。
我们要泛化一个具体接口为通用接口,按规定来说,接口的名称不能包含具体某个类型的名称,例如“UserDao、OrderDao...”都是不符合约定的,而是一个更为通用的名称“CommonDao,IBaseDao,....”这些就符合大众的约定俗成的名称。
下面我们来模拟优化一下冗余的代码。
package xw; public class UserDao { public int add(User user) { return 0; } public int del(User user) { return 0; } public int Update(User user) { return 0; } }
我们用一个通用BaseDao来优化
package xw; /**通用basedao * @author 索隆 * * @param <T> */ public class BaseDao<T> { public int add(T t) { return 0; } public int del(T t) { return 0; } public int Update(T t) { return 0; } } class UserDao extends BaseDao<User>{ public int add(User user) { return 0; } public int del(User user) { return 0; } public int Update(User user) { return 0; } }
我们写一BaseDao用泛型规定,谁要调用传个类进来,就可以对该类进行增删改查的操作,不但少写了很多的代码,还增强了拓展性,泛型类或泛型方法可以适用于不同的数据类型,使数据访问层更加灵活,可以方便地拓展到未来新增的数据类型上。
3.泛型方法
package xw; import java.util.Arrays; public class Test03 { // 定义泛型方法contains,使用类型参数T来指定数组元素类型 public static <T> boolean contains(T[] arr, T target) { for (T element : arr) { if (element.equals(target)) { return true; } } return false; } // 测试泛型方法 public static void main(String[] args) { String[] names = {"John", "Mary", "Bob", "Alice"}; System.out.println(Arrays.toString(names)); System.out.println("Contains \"Bob\"? " + Test03.<String>contains(names, "Bob")); System.out.println("Contains \"Jack\"? " + Test03.<String>contains(names, "Jack")); } }
泛型限定方法的好处在于可以增加代码的复用性和类型安全性。
在泛型规定方法中,可以通过添加限制条件,只允许特定类型的数据作为方法参数,这样能够确保代码的类型安全性。
看到这里,这篇关于泛型的分享就结束了。