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

Java类型推断何时产生无限类型?

Java类型推断(Type Inference)是Java 8引入的一项新特性,它可以根据上下文自动推断出变量的类型,从而简化代码编写过程。在大多数情况下,Java类型推断可以减少冗余代码,提高代码的可读性和可维护性。

然而,Java类型推断也可能在某些情况下产生无限类型(Infinite Types)。这种情况通常发生在使用递归类型的时候,即类型依赖于自身的定义。当编译器无法确定递归类型的边界条件时,就会导致类型推断无限循环,最终导致编译错误。

例如,考虑以下代码片段:

代码语言:java
复制
class MyClass<T> {
    T value;
}

MyClass<?> myClass = new MyClass<>();

在这个例子中,我们定义了一个泛型类MyClass,并创建了一个未指定具体类型的实例myClass。由于未指定具体类型,编译器会尝试通过类型推断来确定myClass的类型。然而,由于MyClass的类型参数T没有明确的边界条件,编译器无法确定T的类型,从而导致类型推断无限循环,最终产生编译错误。

为了避免Java类型推断产生无限类型的问题,可以通过显式指定类型参数或添加边界条件来解决。例如,我们可以修改上述代码如下:

代码语言:java
复制
MyClass<String> myClass = new MyClass<>();

在这个修改后的代码中,我们显式指定了myClass的类型参数为String,从而消除了类型推断无限循环的问题。

总结起来,Java类型推断可能在使用递归类型且缺乏明确边界条件时产生无限类型。为了避免这个问题,可以通过显式指定类型参数或添加边界条件来解决。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java 8 - 04 类型检查、类型推断以及限制

为了全面了解Lambda表达式,women 应该知道Lambda的实际类型是什么 . ---- 类型检查 Lambda的类型是从使用Lambda的上下文推断出来的。...---- 菱形运算符 Java 7中已经引入了菱形运算符( ),利用泛型推断从上下文推断类型的思想。..."); }; ---- 类型推断 刚才已经讨论了如何利用目标类型来检查一个Lambda是否可以用于某个特定的上下文。...Java编译器会从上下文(目标类型推断出用什么函数式接口来配合Lambda表达式,这意味着它也可以推断出适合Lambda的签名,因为函数描述符可以通过目标类型来得到。...因此,Java在访问自由局部变量时,实际上是在访问的副本,而不是访问原始变量。

81210

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

本章包括 21 个涉及 JEP286 或 Java 局部变量类型推断(LVTI)的问题,也称为var类型。这些问题经过精心设计,以揭示最佳实践和使用var时所涉及的常见错误。...78 简单var示例 从版本 10 开始,Java 附带了 JEP286 或 JavaLVTI,也称为var类型。 var标识符不是 Java 关键字,而是保留类型名。...在上一节中,“将var与原始类型结合使用”,我们看到将var与隐式类型转换结合使用会产生实际问题。...使用var而不考虑可能的清晰度损失会产生这些问题。像这样的一些问题和代码将成为一个真正的痛苦。 83 LVTI 与面向接口编程技术相结合 Java 最佳实践鼓励我们将代码绑定到抽象。...也可以间接推断类型

95240

(三)定义类型(自动推断

# 定义 ts 类型(自动推断) 需要注意的是 TypeScript 类型都是小写的,要和 JavaSctipt 里面的构造函数区分开来 // 这种是隐式类型的定义,后面第一次赋值的是啥类型他就是啥类型...let productName = '纯棉 T 恤' // 当我们给他定义好了类型,后面在使用这个数据的时候,就可以自动判断出它里面有那写方法 // 如: productName.price()...// 当我们定义好了类型以后,再给他赋值其他类型的数据就会报错 productName = 12 // 报错 隐式定义类型 let str1 = 'xxx' let number1 = 200...let isShow = true let blog = { title: 'xxx', // 隐式 string 类型 viewCont: 200...// 隐式 number 类型 } let tags = ['JavaScript', 'Vue', 'React'] // 隐式数组中的类型都是 string 类型

37920

TypeScript-自动类型推断

自动类型推断概述不用明确告诉编译器具体是什么类型, 编译器就知道是什么类型根据初始化值自动推断:如果是先定义在初始化, 那么是无法自动推断的let value;value = 123;value = false...;value = 'abc';如果是定义的同时初始化, 那么 TS 就会自动进行类型推断let value = 123;value = 456;value = false;value = 'abc';图片如上的...let value = 123; TS 会自动推断为 let value: number = 123; 所以如上的 value 变量只能存储 number 类型的数据,如上是单个数据类型推断,接下来在来看一个...联合类型推断:let arr = [1, 'a'];arr = ['a', 'b', 'c', 1, 3, 5, false];如上的 let arr = [1, 'a']; TS 会自动推断为...:图片可不是博主自己编写的哦,说明它已经推断出了具体的类型了,雷同如下代码:window.onmousedown = (event: MouseEvent) => { console.log(event.target

18420

TS 4.1 新特性实现 Vuex 无限层级命名空间的 dispatch 类型推断

本文就利用这个特性,简单实现下 Vuex 在 modules 嵌套情况下的 dispatch 字符串类型推断,先看下效果,我们有这样结构的 store: const store = Vuex({ mutations...推断单个 Module Keys 接下来实现 GetModuleMutationKeys,分解一下需求,首先单个 Module 是这样子的: cart: { mutations: {...type AddPrefix = `${Prefix}/${Keys}` 复制代码 这里会自动把联合类型展开并分配,{'cart'}/{'add' | 'remove'} 会被推断成 'cart/add...cart' Key, // 'subCart/add' GetModulesMutationKeys > : never 这样,就巧妙的利用递归把无限层级的...结语 这个新特性给 TS 库开发的作者带来了无限可能性,有人用它实现了 URL Parser 和 HTML parser,有人用它实现了 JSON parse 甚至有人用它实现了简单的正则,这个特性让类型体操的爱好者以及框架的库作者可以进一步的大展身手

2.1K30

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

JDK8之前,java是不支持类型推断的,在JDK8中,引入了lambda表达式,从此类型推断产生了。 本文将会讲解类型推断在lambda表达式中的最佳实践和在使用中应该注意的事项。...,但是java可以从Stream中的类型推断出来。...类型推断对性能的影响 类型推断是个好东西,那么有同学会问了,类型推断对于java的性能会有影响吗? 我们可以把java分成编译和运行两部分。...类型推断的限制 java虽然有类型推断,但是这个推断是有一定的限制的,它并不能够像人一样去思考,但是也已经足够智能了。...注意,上面的例子中,我们定义了返回类型是CustUser的,Java通过这个返回类型推断出传入的实际类型就是CustUser的。是不是很智能。

1K10

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

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

72240

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

引言 Java SE 10 引入了局部变量类型推断。在此之前,任何局部变量的声明都需要在语句左侧给定一个显式类型(explicit type)。...局部变量类型推断在消除冗余信息,使代码更具可读性的同时,也去除了一些有用的信息,反而降低了代码的可读性。此外,还有一些人担心这个特性会被滥用,以至于人们编写出更多差的Java代码。...这也是正确的,不过此特性的加入也可能使人们编写出更多好的Java代码。和所有特性一样,局部变量类型推断的使用也需要加以判断。当然,它的使用与否并没有一个通用的规则。...最小化局部变量的作用域 抛开局部变量推断讲,限制局部变量的作用域也同样是一个好的编程习惯。Effective Java (第三版)第57条(译者注:第二版为第45条)就提及了这一习惯。...若使用var声明变量,那么在未来更改变量的初始值时,变量的推导类型的变更就可能使后续使用该变量的代码产生错误或者BUG。

43910

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

本地类型推断功能背后的主要前提非常简单。使用新的保留类型名称'var'替换声明中的显式类型,并推断类型。...所有类型推断都在编译时发生,显式类型由编译器烘焙到字节代码中。在运行时,Java与以往一样静态。鉴于使用非常简单,本备忘单将集中在本地类型推断的最重要方面 - 它的实际用途。...当您应该使用显式类型以及何时应该考虑类型推断时,它将提供指导。...随着代码的维护,对类型的更改等可能最终会产生不同的行为。例如,从List移动​​到Set可能看起来没问题,但是您的代码是否依赖于稍后在同一范围内的排序?...(); 泛型方法也成功地使用了类型推断,程序员很少提供显式类型参数。

1.2K00
领券