iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java 8中如何进行泛型的目标类型推断
  • 299
分享到

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

2023-06-17 07:06:47 299人浏览 泡泡鱼
摘要

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

Java 8中如何进行泛型的目标类型推断,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

简单理解泛型

泛型是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个:

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

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

让我们看看官网的例子

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程序员,通过编译器自动推断类型的东西可以稍微缓解一下类型转换太复杂的问题。 虽然说是小进步,但对于我们天天写代码的程序员,肯定能带来巨大的作用,至少心情更愉悦了~~说不定在java 9里面,我们会得到一个通用的类型var,像js或者Scala的一些动态语言那样^_^

看完上述内容,你们掌握Java 8中如何进行泛型的目标类型推断的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: Java 8中如何进行泛型的目标类型推断

本文链接: https://www.lsjlt.com/news/287838.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Java 8中如何进行泛型的目标类型推断
    Java 8中如何进行泛型的目标类型推断,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。简单理解泛型泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的...
    99+
    2023-06-17
  • Golang泛型如何影响函数类型推断?
    go泛型通过引入类型参数化改变了函数类型推断:参数类型:[]a,其中a是满足number接口的实际类型参数,在调用时具体化。返回值类型:与参数类型相同,推断为a。 Go 泛型如何影响函...
    99+
    2024-04-16
    golang 泛型
  • 深入浅析Java8中的目标类型推断
    这篇文章将为大家详细讲解有关深入浅析Java8中的目标类型推断,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。简单理解泛型泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说...
    99+
    2023-05-31
    java8 目标类型推断 ava
  • 泛型容器在 C++ 中的类型推断和别名?
    c++++ 中的类型推断和别名增强了泛型容器的灵活性,使其能够自动推断元素类型并使用更简洁的名称。具体来说:类型推断: 编译器自动推断容器及其元素的类型,简化了代码。别名: 可以定义别名...
    99+
    2024-04-24
    类型推断 别名 c++
  • 无法推断函数构造函数的泛型参数中的类型
    php小编柚子将为大家解答一个常见的问题:在构造函数的泛型参数中,无法推断出类型的原因。在PHP中,泛型参数的类型推断是通过参数的默认值来实现的。然而,在构造函数中,由于参数是在对象创...
    99+
    2024-02-09
    编译错误
  • Java中如何获取泛型类型信息
    这篇文章主要讲解了“Java中如何获取泛型类型信息”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中如何获取泛型类型信息”吧!根据使用泛型位置的不同可以分为:声明侧泛型、使用侧泛型。声...
    99+
    2023-07-05
  • golang 如何使用类型断言进行类型转换
    go 中类型断言用于将接口值转换为更具体的类型。它包含以下步骤:声明接口值和目标类型。使用类型断言语法将接口值转换为目标类型,并将结果赋值给变量。使用布尔变量检查转换是否成功。如果转换失...
    99+
    2024-05-01
    类型转换 类型断言 golang
  • 在Golang中,如何将泛型类型的接口与nil进行比较?
    哈喽!今天心血来潮给大家带来了《在Golang中,如何将泛型类型的接口与nil进行比较?》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Gol...
    99+
    2024-04-04
  • Java中如何判断类型
    这篇文章给大家介绍Java中如何判断类型,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 instanceofinstanceof是Java的一个运算符,用来判断一个对象是否为一个类的实例 。用法:boolea...
    99+
    2023-06-16
  • 如何在java中使用泛型类
    如何在java中使用泛型类?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系...
    99+
    2023-06-15
  • 如何在不进行类型检查的情况下获取泛型函数中类型的大小?
    积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《如何在不进行类型检查的情况下获取泛...
    99+
    2024-04-05
  • 文件的真实类型如何利用java进行判断
    文件的真实类型如何利用java进行判断?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。具体代码如下:package com.zhuifeng.util.excel...
    99+
    2023-05-31
    java ava
  • 如何执行类型为受多个返回类型约束的泛型类型的回调?
    问题内容 我试图在我的函数中允许一个允许多个返回元组的回调参数。为了实现这一点,我使用泛型来定义回调的参数类型。 func get[ in any, out any, ...
    99+
    2024-02-12
  • PHP 函数返回值的类型如何推断?
    php 8 引入了类型推断功能,允许在函数声明中指定返回类型(如 functionname(): type)。例如,一个名为 sum 的函数返回 int 类型,可通过 $name = $...
    99+
    2024-04-10
    php 类型推断
  • PyTorch中如何进行模型的部署和推理
    在PyTorch中进行模型的部署和推理通常有以下几个步骤: 加载已经训练好的模型: import torch import to...
    99+
    2024-03-05
    PyTorch
  • 如何理解 C++ 函数模板的类型推断?
    类型推断是 c++++ 函数模板中编译器自动推断函数模板参数类型的重要特性,根据函数参数类型或最合适类型推断模板参数类型。如 max() 函数模板可使用不同类型数组,因为编译器从数组元素...
    99+
    2024-04-24
    c++ 函数模板
  • 如何在PHP中进行类型比较
    PHP是一种流行的服务器端脚本语言,常用于开发动态网站和Web应用程序。一种常见的任务是比较不同类型的值。在PHP中,可以使用一系列比较运算符来比较int,float,string和其他类型的值。本文将介绍如何在PHP中进行类型比较。1.比...
    99+
    2023-05-14
    php 比较运算符
  • 如何在TensorFlow中进行模型的部署和推理
    在TensorFlow中进行模型的部署和推理可以通过以下步骤实现: 训练模型:首先,您需要使用TensorFlow训练您的模型。...
    99+
    2024-03-01
    TensorFlow
  • java如何对clob类型数据进行处理
    在Java中,可以使用`java.sql.Clob`接口来对CLOB类型数据进行处理。以下是一些常见的处理方法:1. 读取CLOB数...
    99+
    2023-10-30
    java
  • 如何在Go语言中启用返回值类型推断
    go 1.18 引入类型推断,通过编译器自动推断变量类型,可显著提升代码可读性和简洁性:启用类型推断:在 go 文件中添加 -trimpath 标志。无需显式指定变量类型:变量值将自动推...
    99+
    2024-04-29
    go语言 返回值类型推断 代码可读性
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作