当前位置: 首页 > news >正文

【Java语法糖】泛型与源码角度分析静态问题

概念

        首先聊聊泛型,泛型是JDK5的新特性。泛型是用来指定不同类型来控制形参具体限制的类型。泛型这种语法机制,只在程序编译阶段起作用,只是给编译器参考的(运行阶段泛型没用)。写了这么多代码应该能知道泛型的优点就是可以使集合中存储的元素类型是统一一致的并且可以做到不需要进行大量的转型。此文章并不主要讲泛型的使用,而是记录源码中泛型的用法,比如<T>这种类型。

public class GenericTest{public static void main(String[] args){//这就是使用泛型的方法 保证此集合只存储String数据类型的元素List<String> list = new ArrayList<String>();//在JDK8后引入了新特性:自动类型推断机制 可以将上面的语句简写为:List<String> list = new ArrayList<>();}
}

泛型表示

        首先应该知道泛型可以被用在什么地方上?答案有:接口方法属性。当然哈,泛型不能用在八种基本数据类型上:byte、short、int、long、float、double、boolena、char。必须用在类名后或者方法返回值之前。泛型的表达式主要有以下几种:

1、<T> 普通符号

2、无边界通配符 <?>

3、上界通配符 <? extends E> E表示父类

4、下界通配符<? super E> 是E的子类

泛型擦除

public class GenericTest {public static void main(String[] args){List<String> l1 = new ArrayList<>();List<Integer> l2 = new ArrayList<>();System.out.println(l1.getClass() == l2.getClass() ? "true" : "false");//true}
}

从上面这个例子可以看出两个集合中存储的类型不一致,但是得到的字节码文件是一样的。这就是因为JVM的泛型擦除机制,在JVM中把泛型给忽略掉了,只保留了原始类型。

静态方法与返回类型

        上文说过:泛型必须用在类名后或者方法返回值之前。所以如果我们编写的类中的静态方法,使其返回的类型为当前类本身并且后面还加了个泛型,那么静态方法后也要加泛型,否则会报错,这是为什么呢?例子如下:

public class Result<T> {private T data;//这样写是会报错的public static Result<T> ok(T data){return Result.ok(data);}//必须在静态方法后也加个泛型public static<T> Result<T> ok(T data){return Result.ok(data);}//如果不想报错就写成非静态的public Result<T> ok(T data){return Result.ok(data);}
}

        上述这个例子就必须研究到JVM的类加载机制:

        静态方法和普通方法的生命周期不一致:静态方法生命周期属于类加载的时候,在Java中泛型只是一个占位符,必须传递具体类型才可以使用,也就是类实例化的时候才传递具体参数类型,由于静态方法的加载在类实例化之前,也就是说在类未实例化的时候,类中的泛型还没有传递真正的类型参数,这时候静态方法就已经加载完成。显然,静态方法不能使用/也就是访问不到泛型类中的泛型,所以需要加<T>声明使用哪种泛型类型。所以说,如果不想报错的话也可以不用静态方法。

        还有一点就是关于泛型擦除。Java的泛型属于伪泛型,也就是说只会在编译期才生效。编译之后会产生泛型擦除。比如T就会被JVM认成Object。

http://www.lryc.cn/news/56517.html

相关文章:

  • App 抓包提示网络异常怎么破?
  • 操作系统-文件系统
  • 虚拟机无法访问外网的问题
  • 软件测试【常见】62 道面试题,不背完这些你还想去面试?
  • 聚观早报 | ChatGPT 停止 Plus 付费;李子柒油管广告收益登顶热搜
  • 对接多个 Neuron 实例,实现多网关协同分析与设备联动
  • windows下 Jenkins 主从节点通过SSH连接
  • JAVA练习101-任务调度器
  • 华为OD机试-匿名信-2022Q4 A卷-Py/Java/JS
  • muduo源码剖析--Inetaddress/Socket/Acceptor
  • 域名过户操作流程及常见问题
  • 多国拟发ChatGPT禁令 关“野兽”的笼子要来了?
  • 深度学习中,Params参数量和FLOPs计算量分别指什么
  • 1分钟快速制作思维导图「ChatGPT+XMind」—— 跟上时代的脚步,这辈子就起飞了 - 第5篇
  • 生成与获取token
  • 【人工智能】ChatGTP从入门到精通
  • 电脑桌面图标间距突然变大怎么恢复
  • 详解各版本Web服务器限制请求体大小的方法
  • 二叉树_详解
  • LOTO示波器电源环路增益分析客户实测
  • Netty主要组件
  • Linux系统【centos7】常用基础命令教程
  • 【Redis学习】Redis入门概述
  • nodejs微服务:Consul集群
  • spring事务处理
  • 2023 年博客之星的入围规则
  • 【新2023Q2押题JAVA】华为OD机试 - 查找树中的元素 or 查找二叉树节点
  • MySQL 日志:undo log、redo log、binlog 有什么用?
  • ETL 与 ELT的关键区别
  • Thinkphp 6.0模版的杂项和表单令牌