首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java 编程问题:四、类型推断

本章包括 21 个涉及 JEP286 或 Java 局部变量类型推断(LVTI)的问题,也称为var类型。这些问题经过精心设计,以揭示最佳实践和使用var时所涉及的常见错误。...我强烈建议您在使用解决方案和下载示例程序之前,先尝试一下每个问题: 简单var示例:编写一个程序,举例说明类型推断(var)在代码可读性方面的正确用法。...78 简单var示例 从版本 10 开始,Java 附带了 JEP286 或 JavaLVTI,也称为var类型。 var标识符不是 Java 关键字,而是保留类型名。...如下面的屏幕截图所示,编译器在推断正确的类型方面没有问题,但是对于人类来说,这要困难得多: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FcuV0SJX-1657077646421...,代码将失败,并有可能从float到int异常的有损转换。

1.1K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java中的类型推断和lambda表达式

    简介 java是强类型的编程语言,每个java中使用到的变量都需要定义它的类型,否则会编译失败。...JDK8之前,java是不支持类型推断的,在JDK8中,引入了lambda表达式,从此类型推断产生了。 本文将会讲解类型推断在lambda表达式中的最佳实践和在使用中应该注意的事项。...,但是java可以从Stream中的类型推断出来。...所以变量名的定义一定要有意义。 类型推断对性能的影响 类型推断是个好东西,那么有同学会问了,类型推断对于java的性能会有影响吗? 我们可以把java分成编译和运行两部分。...类型推断的限制 java虽然有类型推断,但是这个推断是有一定的限制的,它并不能够像人一样去思考,但是也已经足够智能了。

    1.1K10

    使用Java 10的var类型推断的几个注意点!

    使用var需要通过减少混乱来改进代码,从而使更重要的信息脱颖而出。 本地类型推断功能背后的主要前提非常简单。使用新的保留类型名称'var'替换声明中的显式类型,并推断其类型。...所有类型推断都在编译时发生,显式类型由编译器烘焙到字节代码中。在运行时,Java与以往一样静态。鉴于使用非常简单,本备忘单将集中在本地类型推断的最重要方面 - 它的实际用途。...虽然类型总是静态设置,但使用相同接口的实现中的细微差别可能会让您失望。应该更改代码以减少局部变量的作用域,然后用var声明它们,而不是简单地避免在这些情况下使用var。...5.不要担心使用局部变量导致“编程接口”太多 Java编程中常见的习惯用法是构造具体类型的实例,但要将其分配给接口类型的变量。...但是,如果一起使用,它们可能最终会省略编译器正确缩小您希望推断的类型所需的所有有用信息。

    1.3K00

    翻译 – Java局部变量类型推断的代码风格规范

    引言 Java SE 10 引入了局部变量类型推断。在此之前,任何局部变量的声明都需要在语句左侧给定一个显式类型(explicit type)。...局部变量类型推断在消除冗余信息,使代码更具可读性的同时,也去除了一些有用的信息,反而降低了代码的可读性。此外,还有一些人担心这个特性会被滥用,以至于人们编写出更多差的Java代码。...这也是正确的,不过此特性的加入也可能使人们编写出更多好的Java代码。和所有特性一样,局部变量类型推断的使用也需要加以判断。当然,它的使用与否并没有一个通用的规则。...那么对于类型推导,在可以通过IDE而简单确定一个变量类型的情况下,我们为何不在任何地方都使用var呢? 有两个原因。其一是我们经常需要在不便使用IDE的情况下阅读代码。...最小化局部变量的作用域 抛开局部变量推断讲,限制局部变量的作用域也同样是一个好的编程习惯。Effective Java (第三版)第57条(译者注:第二版为第45条)就提及了这一习惯。

    48910

    Java 10 实战第 1 篇:局部变量类型推断

    今天要实战的是 Java 10 中最重要的特性:局部变量类型推断,大家都知道是 var 关键字,但具体怎么使用,及要注意什么要点呢? 我们通过几个例子来讲解局部变量类型推断这个新特性!...什么是局部变量类型推断 var javastack = "javastack"; System.out.println(javastack); 大家看出来了,局部变量类型推断就是左边的类型直接使用 var...定义,而不用写具体的类型,编译器能根据右边的表达式自动推断类型,如上面的 String 。...var关键字原理 var其实就是 Java 10 增加的一种语法糖而已,在编译期间会自动推断实际类型,其编译后的字节码和实际类型一致,如以下例子所示。...OK,本次 Java 10 局部变量类型推断实战文章就到这里了,后续带来更多的 Java 10 的实战方面的文章。 往期干货推荐 1. 5月份值得一看的 Java 技术干货 2.

    75340

    Go语言进阶:类型推断、类型断言与泛型的深入探索

    函数返回值的类型推断在Go语言中,函数返回值的类型也可以被推断。当函数体中有返回语句时,编译器会根据返回语句中的值推断返回值的类型。...使用类型断言处理接口值类型断言与ok值判断由于类型断言可能失败(即接口值不包含我们想要断言的类型),因此在使用类型断言时,通常需要检查ok的值以进行错误处理。...(int); ok { // 类型断言成功,可以安全地使用 value 作为 int 类型的变量 fmt.Println(value) } else { // 类型断言失败...,处理错误情况 fmt.Println("类型断言失败,interfaceValue 不是 int 类型") }类型断言与switch当需要处理多种可能的类型时,可以使用类型开关(type...}Any的实践案例泛型Any在数据结构中的应用 空接口可以用来创建能够存储任意类型数据的容器,如简单的泛型列表或映射。

    1.4K10

    用泛型来实现编译时期的类型推断

    第一章都是讲泛型的,距离上一篇Effective C#的随笔已经是很久以前的事情了。。。 今天Item4,讲的是泛型的类型推断功能。...这里有几个缺点 ①每次调用LoadFromFile方法,必须有一个类型转换,从Object转成自己要的类型,写的时候肯定不会报错的,因为Object是所有类型的基类,但是运行的时候,就不一定了~~ 。...20行,先ClassA类型的obj调用,factory生成一个实例,木有问题;然后来一个ClassB类型的obj调用,factory != null ;然后,22行,调用,异常就来了。...解决了原先的几个问题。 ①类型转换。泛型类中的LoadFromFile方法,返回的类型其实已经被限定了,就是T类型,至于T具体是什么类型,就看自己在调用的时候尖括号之间写的具体的值了。...并且,如果传入了不同类型的obj,也会重新new一个对应类型的XmlSerializer 类型的factory,这样就不会报错。(想到一个问题,写完之后查资料了解一下)。

    1.2K30

    【TypeScript 演化史 -- 7】映射类型和更好的字面量类型推断

    在运行时,分配要么抛出一个类型错误(严格模式),要么静默失败(非严格模式)。 虽然上面的示例可以正确地编译和工作,但它有两大缺点 需要两个接口。...更好的字面量类型推断 字符串、数字和布尔字面量类型(如:"abc",1和true)之前仅在存在显式类型注释时才被推断。从 TypeScript 2.1 开始,字面量类型总是推断为默认值。.../ 推断类型: "https://example.com/" 由于常量字符串变量的值永远不会改变,因此推断出的类型会更加的具体。...如果用直接的数值或布尔值初始化常量,推断出的还是字面量类型: const HTTPS_PORT = 443; // 推断类型: 443 const rememberMe = true; // 推断类型...推断字面量类型的有用性 你可能会问自己,为什么推断 const 变量和 readonly 属性为字面量类型是有用的。

    2.9K10

    Java常见集合类型及其异同点,简单使用

    Java集合是Java编程语言中的一个非常重要的部分。Java集合类是Java开发中最通用的类之一,它提供了一种方便的方法来管理一组对象。Java集合框架提供了一个标准的框架来表示和操作集合对象。...Java集合框架由一组接口、抽象类和实现类组成。在Java集合类中,主要有以下几种集合类型: List:元素按顺序排列的集合,可以通过位置访问集合中的元素,允许重复元素。...Set:不允许重复元素的集合,没有顺序要求。 Map:一种键值对形式的存储结构,每个键对应一个值。 接下来让我们来具体了解Java集合的三种基本类型。...下面是一个使用ArrayList的例子: import java.util.ArrayList; import java.util.List; public class TestList {...在Java面试中,也经常会涉及到集合类的细节问题,比如ArrayList和LinkedList的区别、HashMap的原理和实现等等,要熟练掌握集合类的用法和知识点,才能通过Java面试。

    20110

    【Groovy】Groovy 动态语言特性 ( Groovy 中的变量自动类型推断以及动态调用 | Java 中必须为变量指定其类型 )

    文章目录 前言 一、Groovy 动态语言 二、Groovy 中的变量自动类型推断及动态调用 三、Java 中必须为变量指定其类型 前言 Groovy 是动态语言 , Java 是静态语言 ; 一、Groovy...动态语言 ---- Groovy 语言是动态语言 , 其类型是在运行时进行确定的 , 如使用 def name 声明一个变量 , 声明时不指定变量类型 ; 在运行时为其赋值一个 String 类型变量或常量..., name = "Tom" 则该声明的变量 , 在运行时会被自动推断为 String 类型变量 ; Groovy 的 变量 , 方法 , 函数实参 的类型 , 都是在运行时推断与检查的 ; 二、Groovy...中的变量自动类型推断及动态调用 ---- 在 Groovy 中 , 如果声明 class Groovy { static void main(String[] args) {...中必须为变量指定其类型 ---- 在 Java 中 , 如果声明 Object 类型变量 , 为其赋值一个 String 类型常量 , public class Java { public static

    2.2K30

    JSONEncoder 基础类型编码失败的解决方法

    JSONEncoder 在 Swift 中还是非常常用的,最近项目中有需要将APP数据转换为JSON格式之后,再发送给服务器的需求,测试过程中,然后报了如下错误: invalidValue(Optional...,而基础类型 Int , Double, String 等,均无法编码成功,可是查看encode 接口并没有相关描述: open class JSONEncoder { ... ///...underlyingError: error)) } } } 内部实现会先调用 box_方法封装,得到topLevel, 实际上 box_ 内部主要又是调用 box 方法将基础类型转换为...NSString 和 NSNumber(这里只关注基础类型,其他的可以自行查看源码) 所以才有了encode 中的判断 NSNumber 和 NSString 然后抛出异常。。。...stdlib/public/SDK/Foundation/JSONEncoder.swift /// 从源码也找不到具体是从哪个版本才支持对 Int Double String 等基本类型的的支持

    82310

    【TypeScript 演化史 — 第七章】映射类型和更好的字面量类型推断

    在运行时,分配要么抛出一个类型错误(严格模式),要么静默失败(非严格模式)。 虽然上面的示例可以正确地编译和工作,但它有两大缺点 需要两个接口。...更好的字面量类型推断 字符串、数字和布尔字面量类型(如:"abc",1和true)之前仅在存在显式类型注释时才被推断。从 TypeScript 2.1 开始,字面量类型总是推断为默认值。.../ 推断类型: "https://example.com/" 由于常量字符串变量的值永远不会改变,因此推断出的类型会更加的具体。...如果用直接的数值或布尔值初始化常量,推断出的还是字面量类型: const HTTPS_PORT = 443; // 推断类型: 443 const rememberMe = true; // 推断类型...推断字面量类型的有用性 你可能会问自己,为什么推断 const 变量和 readonly 属性为字面量类型是有用的。

    3.8K40

    Java 10 新特性解密,引入类型推断机制,将于 2018 年 3 月 20 日发布

    JDK 10 是 Java 10 标准版的部分实现,将于 2018 年 3 月 20 日发布,改进的关键点包括一个本地类型推断、一个垃圾回收的“干净”接口。...,通过增强语言特性将类型推断扩展到局部变量,目的是减少与编码相关的“仪式”,同时保持对静态类型的安全承诺。...局部变量类型推断 强类型编程语言有很多优点,包括在编译时发现类型错误,但是它们也引入了大量的样板代码,特别是在定义局部变量时。...许多最流行的强类型的编程语言,比如C++, C#以及Go,在定义过程中,提供一种局部变量类型推断的功能(例如C++提供了auto 关键字,C#提供var关键字)。...同样,类型推断将受到以下方式的约束: 推断类型将被限制在局部变量的初始化,增强的for循环索引,以及传统的for循环中声明;它(将)不用于方法形式、构造函数形式、方法返回类型、字段、捕获形式,或任何其他类型的变量声明

    1.1K80
    领券