一文吃透泛型

打印 上一主题 下一主题

主题 546|帖子 546|积分 1638

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~
Github地址
如果访问不了Github,可以访问gitee地址。
gitee地址
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
泛型带来的好处

在没有泛型的情况的下,通过对类型 Object 的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是本身就是一个安全隐患。
那么泛型的好处就是在编译的时候能够检查类型安全,并且所有的强制转换都是自动和隐式的。
  1. public class GlmapperGeneric<T> {
  2.   private T t;
  3.     public void set(T t) { this.t = t; }
  4.     public T get() { return t; }
  5.     public static void main(String[] args) {
  6.         // do nothing
  7.     }
  8.   /**
  9.     * 不指定类型
  10.     */
  11.   public void noSpecifyType(){
  12.     GlmapperGeneric glmapperGeneric = new GlmapperGeneric();
  13.     glmapperGeneric.set("test");
  14.     // 需要强制类型转换
  15.     String test = (String) glmapperGeneric.get();
  16.     System.out.println(test);
  17.   }
  18.   /**
  19.     * 指定类型
  20.     */
  21.   public void specifyType(){
  22.     GlmapperGeneric<String> glmapperGeneric = new GlmapperGeneric();
  23.     glmapperGeneric.set("test");
  24.     // 不需要强制类型转换
  25.     String test = glmapperGeneric.get();
  26.     System.out.println(test);
  27.   }
  28. }
复制代码
上面这段代码中的 specifyType 方法中 省去了强制转换,可以在编译时候检查类型安全,可以用在类,方法,接口上。
泛型中通配符

我们在定义泛型类,泛型方法,泛型接口的时候经常会碰见很多不同的通配符,比如 T,E,K,V 等等,这些通配符又都是什么意思呢?
常用的 T,E,K,V,?

本质上这些个都是通配符,没啥区别,只不过是编码时的一种约定俗成的东西。比如上述代码中的 T ,我们可以换成 A-Z 之间的任何一个 字母都可以,并不会影响程序的正常运行,但是如果换成其他的字母代替 T ,在可读性上可能会弱一些。通常情况下,T,E,K,V,?是这样约定的:

  • ?表示不确定的 java 类型
  • T (type) 表示具体的一个java类型
  • K V (key value) 分别代表java键值中的Key Value
  • E (element) 代表Element
?无界通配符

先从一个小例子看起。最全面的Java面试网站
我有一个父类 Animal 和几个子类,如狗、猫等,现在我需要一个动物的列表,我的第一个想法是像这样的:
  1. List<Animal> listAnimals
复制代码
但是老板的想法确实这样的:
  1. List<? extends Animal> listAnimals
复制代码
类型参数列表中如果有多个类型参数上限,用逗号分开
下界通配符 < ? super E>

下界: 用 super 进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至 Object
在类型参数中使用 super 表示这个泛型中的参数必须是 E 或者 E 的父类。
[code]private  void test(List
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

欢乐狗

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表