我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java 8 - 类型推断优化

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java 8 - 类型推断优化

理解Java 8 类型推断需理解几个问题: @pdai

  • 什么是泛型
  • Java7对泛型推断做了哪些优化
  • Java8对此有做了哪些优化
  • Java 8 - 类型推断优化
    • 简单理解泛型
    • 泛型的尴尬
    • java7的泛型类型推断改进
    • Java8的泛型类型推断改进
    • 总结

# 简单理解泛型

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。通俗点将就是“类型的变量”。这种类型变量可以用在类、接口和方法的创建中。

理解Java泛型最简单的方法是把它看成一种便捷语法,能节省你某些Java类型转换(casting)上的操作:

List<Apple> box = new ArrayList<Apple>();box.add(new Apple());Apple apple =box.get(0);

上面的代码自身已表达的很清楚: box是一个装有Apple对象的List。get方法返回一个Apple对象实例,这个过程不需要进行类型转换。没有泛型,上面的代码需要写成这样:

Apple apple = (Apple)box.get(0);

# 泛型的尴尬

泛型的最大优点是提供了程序的类型安全同时可以向后兼容,但也有尴尬的地方,就是每次定义时都要写明泛型的类型,这样显示指定不仅感觉有些冗长,最主要是很多程序员不熟悉泛型,因此很多时候不能够给出正确的类型参数,现在通过编译器自动推断泛型的参数类型,能够减少这样的情况,并提高代码可读性。

# java7的泛型类型推断改进

在以前的版本中使用泛型类型,需要在声明并赋值的时候,两侧都加上泛型类型。例如:

Map<String, String> myMap = new HashMap<String, String>();

你可能觉得:老子在声明变量的的时候已经指明了参数类型,为毛还要在初始化对象时再指定? 幸好,在Java SE 7中,这种方式得以改进,现在你可以使用如下语句进行声明并赋值:

Map<String, String> myMap = new HashMap<>(); //注意后面的"<>"

在这条语句中,编译器会根据变量声明时的泛型类型自动推断出实例化HashMap时的泛型类型。再次提醒一定要注意new HashMap后面的“<>”,只有加上这个“<>”才表示是自动类型推断,否则就是非泛型类型的HashMap,并且在使用编译器编译源代码时会给出一个警告提示。

但是: Java SE 7在创建泛型实例时的类型推断是有限制的: 只有构造器的参数化类型在上下文中被显著的声明了,才可以使用类型推断,否则不行。例如: 下面的例子在java 7无法正确编译(但现在在java8里面可以编译,因为根据方法参数来自动推断泛型的类型):

List<String> list = new ArrayList<>();
list.add("A");// 由于addAll期望获得Collection<? extends String>类型的参数,因此下面的语句无法通过
list.addAll(new ArrayList<>());

# Java8的泛型类型推断改进

java8里面泛型的目标类型推断主要2个:

1.支持通过方法上下文推断泛型目标类型

2.支持在方法调用链路当中,泛型类型推断传递到最后一个方法

让我们看看官网的例子

class List<E> {
   static <Z> List<Z> nil() { ... };
   static <Z> List<Z> cons(Z head, List<Z> tail) { ... };
   E head() { ... }
}

根据JEP101的特性,我们在调用上面方法的时候可以这样写

//通过方法赋值的目标参数来自动推断泛型的类型
List<String> l = List.nil();
//而不是显示的指定类型
//List<String> l = List.<String>nil();
//通过前面方法参数类型推断泛型的类型
List.cons(42, List.nil());
//而不是显示的指定类型
//List.cons(42, List.<Integer>nil());

# 总结

以上是JEP101的特性内容了,Java作为静态语言的代表者,可以说类型系统相当丰富。导致类型间互相转换的问题困扰着每个java程序员,通过编译器自动推断类型的东西可以稍微缓解一下类型转换太复杂的问题。 虽然说是小进步,但对于我们天天写代码的程序员,肯定能带来巨大的作用,至少心情更愉悦了

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java 8 - 类型推断优化

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java 8 - 类型推断优化

理解Java 8 类型推断需理解几个问题: @pdai什么是泛型Java7对泛型推断做了哪些优化Java8对此有做了哪些优化Java 8 - 类型推断优化简单理解泛型泛型的尴尬java7的泛型类型推断改进Java8的泛型类型推断改进总结#
2022-12-02

Java 8中如何进行泛型的目标类型推断

Java 8中如何进行泛型的目标类型推断,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。简单理解泛型泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的
2023-06-17

解密 VUE 如何使用类型推断优化 JavaScript 代码

标题:“VUE使用类型优化JavaScript要求演示”
解密 VUE 如何使用类型推断优化 JavaScript 代码
2024-02-15

Java 8 - 类型注解

理解Java 8 类型注解需理解几个问题: @pdai注解在JDK哪个版本中出现的,可以在哪些地方用注解?什么是类型注解?类型注解的作用是什么?为什么会出现类型注解(JSR308)?Java 8 - 类型注解什么是类型注解类型注解的作用类型
2022-12-02

SpringBoot 的 web 类型推断详解

这篇文章主要介绍了SpringBoot 的 web 类型推断详解的相关资料,需要的朋友可以参考下
2022-12-27

详解C++11中的类型推断

C++11中为了更好的支持泛型编程,提供了 auto和decltype两个关键词,目的就是提供编译阶段的自动类型推导,这篇文章主要介绍了C++11中的类型推断,需要的朋友可以参考下
2023-01-31

Golang泛型如何影响函数类型推断?

go泛型通过引入类型参数化改变了函数类型推断:参数类型:[]a,其中a是满足number接口的实际类型参数,在调用时具体化。返回值类型:与参数类型相同,推断为a。Go 泛型如何影响函数类型推断Go 语言中的泛型引入了一种新的类型推断机制,
Golang泛型如何影响函数类型推断?
2024-04-16

C++中的类型推断问题详解

C++中的类型推断问题详解在C++编程中,类型推断是指编译器根据代码的上下文环境自动推断变量的数据类型。它可以使代码更加简洁、易读,并减少了程序员的工作量。然而,类型推断也可能带来一些问题,本文将详细介绍这些问题,并提供具体的代码示例。自动
2023-10-22

泛型容器在 C++ 中的类型推断和别名?

c++++ 中的类型推断和别名增强了泛型容器的灵活性,使其能够自动推断元素类型并使用更简洁的名称。具体来说:类型推断: 编译器自动推断容器及其元素的类型,简化了代码。别名: 可以定义别名来用更简洁的名称表示泛型容器类型,提高可读性。类型推断
泛型容器在 C++ 中的类型推断和别名?
2024-04-24

Java中如何判断类型

这篇文章给大家介绍Java中如何判断类型,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 instanceofinstanceof是Java的一个运算符,用来判断一个对象是否为一个类的实例 。用法:boolean isI
2023-06-16

Go语言返回值类型推断对自动化测试的意义

go 语言返回值类型推断简化了自动化测试:允许编译器根据函数实现推断返回值类型,消除显式声明的需要。提高测试函数的简洁性和可读性,简化函数输出验证。实战案例展示了如何使用类型推断编写自动化测试,验证函数输出符合预期。Go 语言返回值类型推断
Go语言返回值类型推断对自动化测试的意义
2024-04-29

VUE 类型推断与其他类型系统对比:优劣势分析与应用场景解读

VUE 类型推断与其他类型系统之优劣势分析与应用场景解读 vue、类型推断、类型系统、比较、应用场景 一、引言
VUE 类型推断与其他类型系统对比:优劣势分析与应用场景解读
2024-02-15

深入浅析Java8中的目标类型推断

这篇文章将为大家详细讲解有关深入浅析Java8中的目标类型推断,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。简单理解泛型泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说
2023-05-31

C++ 函数返回值类型推断的原理

c++++ 中函数返回值类型由编译器推断,原理是通过模板元编程(tmp)来分析函数体,根据 return 语句的返回值推导类型:单个 return 语句:返回值为返回表达式的类型。多个 return 语句:返回值为所有返回表达式的公共类型。
C++ 函数返回值类型推断的原理
2024-04-13

PHP 函数返回值的类型如何推断?

php 8 引入了类型推断功能,允许在函数声明中指定返回类型(如 functionname(): type)。例如,一个名为 sum 的函数返回 int 类型,可通过 $name = $user->getname() 来调用。需要注意,实际
PHP 函数返回值的类型如何推断?
2024-04-10

java判断是否是Long类型

java判断是否是Long类型1、首先定义一个getType方法,接收一个Object类型的参数;2、然后使用getClass方法获取class类型的对象;3、再使用toString()方法转为字符串,并使用substring截取字符串获得变量类型;4、最后根
java判断是否是Long类型
2017-10-29

java怎么判断对象类型

在Java中,可以使用instanceof关键字来判断一个对象的类型。例如,可以使用以下代码来判断一个对象是否属于某个特定类:Object obj = new String("Hello");if(obj instanceof Stri
java怎么判断对象类型
2024-03-01

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录