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

Kotlin类型擦除-为什么只有泛型类型可编译的函数是不同的,而返回类型不同的函数是不同的?

Kotlin类型擦除是指在编译过程中,泛型类型信息会被擦除,导致在运行时无法获取具体的泛型类型。在Kotlin中,只有泛型类型可编译的函数是不同的,而返回类型不同的函数是相同的,这是因为编译器在处理泛型类型时的不同策略所导致的。

对于泛型类型可编译的函数,编译器会根据不同的泛型类型生成不同的字节码,从而实现类型安全。这意味着对于不同的泛型类型,编译器会生成不同的函数实现,保证了类型的正确性。例如,对于一个泛型函数fun <T> printList(list: List<T>),如果传入的是List<String>List<Int>,编译器会分别生成针对这两种类型的函数实现。

而对于返回类型不同的函数,编译器会将它们视为相同的函数,因为返回类型在运行时并不会影响函数的调用和执行。编译器会根据函数的参数类型和函数体逻辑来确定函数的唯一标识,而不考虑返回类型的差异。这样做可以减少编译器生成的函数数量,提高编译效率。

在实际应用中,泛型类型可编译的函数常用于处理集合、容器等需要保持类型安全的场景。而返回类型不同的函数则更多用于根据不同的输入参数返回不同类型的结果,例如根据用户输入的参数动态生成不同类型的对象。

对于腾讯云相关产品和产品介绍链接地址,由于要求不能提及具体的云计算品牌商,无法给出相关链接。但腾讯云作为一家知名的云计算服务提供商,提供了丰富的云计算产品和解决方案,可以通过搜索腾讯云官方网站获取相关信息。

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

相关·内容

  • 在Java中为什么不同返回类型不算方法重载?

    doSomething } public void method(Integer id, String name) { // doSomething } } 为什么不同返回类型不算方法重载...方法签名由:方法名称 + 参数类型 + 参数个数组成一个唯一值,这个唯一值就是方法签名, JVM(Java 虚拟机)就是通过这个方法签名来决定调用哪个方法。...从方法签名组成规则我们可以看出,方法返回类型不是方法签名组成部分,所以当同一个类中出现了多个方法名和参数相同,但返回类型不同方法时,JVM 就没办法通过方法签名来判断到底要调用哪个方法了,如下图所示...: 那为什么返回类型不能做为方法签名一部分呢?...总结 在同一个类中定义了多个同名方法,但每个方法参数类型或者参数个数不同就是方法重载。方法重载典型使用场景 String 中 valueOf 方法,它有 9 种实现。

    3.4K10

    是否还在疑惑Vue.js中组件data为什么函数类型不是对象类型

    分析Vue.js组件中data为何函数类型而非对象类型 引言 正文 一、Vue.js中data使用 二、data为对象类型 三、data为函数 结束语 引言 要理解本篇文章,必须具备JavaScript...,我们再来看看data为函数例子,一般只有复用Vue实例中,data才为函数 data: function() { return { name: '李四', age: '55' }...= new Vue() //此时vm2这样 vm2 = { //这里data,先获取了函数Vue中data(data值为函数),然后得到了data返回值 data: { name...这是因为这两个实例对象在创建时,先获得了一个函数,将该函数返回值作为了自己属性data值,并且这两个实例对象中data值在栈中对应堆中地址也不一样,所以他们不会互相影响。...所以我们在使用复用组件时,申明data属性值时,必须要使用函数类型,因为每次创建实例对象时,他们都是获取属于他们自己一个对象值,并且对应堆中地址都不相同,所以互不影响。

    3.5K30

    Golang 函数返回类型接口时返回对象指针还是值

    1.接口简介 Interface 一组抽象方法(未具体实现方法,仅包含方法名参数返回方法)集合,如果实现了 interface 中所有方法,即该类型就实现了该接口。...接口声明格式: type InterfaceName interface { //方法列表 } 2.函数返回类型接口时返回对象指针还是值 函数返回类型接口时返回对象指针还是值,这个要看具体需要...期望原对象在后续操作中被修改则返回对象指针。返回对象值则返回对象副本,对对象副本修改不会影响原对象。 返回对象指针示例。...=createEmployeeObj() o.Set() o.Print() e.Print() } 输出结果: company=alibaba company=alibaba 可见函数返回类型接口时返回对象指针...company="alibaba" e1.Print() } e.Print() } 输出结果: company=alibaba company=tencent 可见函数返回类型接口时返回对象

    8K30

    C# 8.0 空引用类型,不止加个问号哦!你还有很多种不同空玩法

    你可能会好奇,C# 语言空特性为什么编译成类库之后,依然可以被引用它程序集识别。...这些古老框架中没有这些新出来类型为什么也可以携带类型空特性呢? 实际上反编译一下编译出来程序集就能立刻看到结果了。...输出:MaybeNull 如果你有尝试过迁移代码到类型,基本上一定会遇到方法迁移问题: 1 2 3 public T Find(int index) { } 比如以上这个方法,找到了就返回找到值...那么问题来了,T 没有指定这是值类型还是引用类型。 如果 T 引用类型,那么默认值 default(T) 就会引入 null。但是 T 并没有写成 T?,因此它是不可为 null 。...然而值类型和引用类型 T? 代表不同含义。这种矛盾应该怎么办?

    1.2K20

    Java避坑记:比较数字不同包装类型,千万注意使用equals方法导致问题

    ---- Java中,比较两个不同类型包装类型时候,即使数值相等,使用equals方法也会返回false ---- 示例: public static void main(String[] args...= null && a.equals(b)); } 其他数字类型源码暂不贴出。 从源码看出,包装数字类型,使用equals方法前提必须类型一致。...); System.out.println(Integer.compare(a, Math.toIntExact(b))); } 结果: 小结 ---- Java中,比较两个不同类型包装类型时候或原生类型和包装类型混用...,即使数值相等,使用equals方法也会返回false。...封装数字类型,使用equals方法前提必须类型一致,我们必须类型转换成同一类型。 数字类型比较最好使用compare方法。 ----

    40520

    音乐、美女、益智三种不同类型题材VR游戏,总有一款菜!

    本次新上架游戏游戏涵盖了音乐,运动,美女,益智,休闲等多种游戏类型,适合各个年龄层玩家。《妹子真爱打篮球》和《昆塔·反转星球》7663VR竞技平台首发作品。...与这两款游戏一同登录音乐游戏《电音骑士》。 上架首日限时免费畅玩 为配合三款新游上架,7663VR竞技平台推出新游限免活动。...《电音骑士》:VR音游,让你成为动感DJ 《电音骑士》一款基于Unreal 4开发创新式音乐类型VR游戏。玩家将在游戏中扮演一名未来世界DJ,在赛博音乐世界中进行音乐表演。...同时,玩家每次游戏体验都将呈现其世界内名次和本地名次,玩家直观在7663VR竞技平台上查看自己游戏表现。...游戏中多达三十道谜题,丰富挑战设计着重考验玩家基于空间观察思考能力, 游戏中还设立了单纯关与要素收集两种不同要素,让不同类型玩家选择适合自己方式享受解密乐趣。

    74690

    Kotlin | 9.

    本章内容包括: 声明函数和类 类型擦除和实化类型参数 声明点变型和使用点变型 9.1 类型参数 // 如果要创建一个空列表,必须显示指定,有值的话可以被推导出来...和Java一样,Kotlin在运行时也被擦除了。...out 位置 */ // ListList只读,所以它只有一个返回类型为 T 元素方法 get,没有定义任何类型为T元素存储到列表中方法...和 Java 样,类型类型实参只在编译期存在。 不能把带类型实参类型和 is 运算符一起使用 ,因为类型实参在运行时将被擦除。...变型一种说明两种拥有相同基础类型不同类型参数类型之间子类型化关系方式,它说明了如果其中一个类型类型参数另一个类型参数类型 这个类型就是另外一个类型类型或者超类型

    1.8K10

    Kotlin | 浅谈 Reified 与 三两事

    而在 Kotlin 中,由于最终也会被编译为java字节码,所以无可避免也存在这上述问题。 什么类型擦除?...因为从底层上说是一种语法糖,它只存在于 编译期 。在代码运行期间,jvm会将相关信息擦除,成功编译 class文件 不会包含任何信息。...Kotlin 中存在名为 reified 关键字,它可以被作用于函数上, 以此做到类型擦除再生,便于开发者优雅使用以及获取方法类型。...从而让本该在编译阶段被擦除Activity类型,能够在运行时获取到。 但需要注意,reified 关键字必须和 inline 关键字一起使用(下面会提到为什么)。...这也就是为什么 reified 必须要增加 inline ,因为其必须内联才能知道具体类型,从而将我们实际类型更新到具体调用代码中,从而完成类型再生。

    49220

    Kotlin Vocabulary | Reified: 类型擦除后再生计划

    对编程语言类型系统进行了扩展,从而允许一个类型或方法在保证编译类型安全前提下,还可以对不同类型对象进行操作。...但是使用也会有一些限制,比如当您在函数中想要获取所表示类型具体信息时,编译器就会报错,提示说相关信息不存在。 "reified" 关键字,正是为了解决此类问题诞生。...下面就来看看这是如何在 Kotlin 中实现 在 Java 5.0 版本之前并未支持,那时 Java 中 collection 没有类型信息。...= list.get(0); 复制代码 通过一种叫 类型擦除 (type erasure) 技巧实现。...使用内联函数编译器可以在复制函数体时,同样将返回类型替换为实际所表示类型

    1.3K10

    Kotlin变之路

    首先,Java中具有「不变性」,也就是说,编译器会认为List和List两个完全不同类型,当然,不仅仅是List,比如下面这个例子。...extends 父类型>来实现。实例化时确定为「父类型未知类型」,所以它「只能读不能写」,因为编译器不确定到底哪个子类。例如下面的代码。...reified 由于在Java会进行擦除,所以编译器无法在运行时知道一个确切类型,也就是说,我们无法在运行时,判断一个对象是否为一个T实例,例如下面的代码。...这其实就是内联作用,虽然这里对T做判断,但实际上在编译时,这里已经被替换成了具体类型不再T了,所以当然可以使用is来进行类型判断了。...那么我们在实际代码中,要在哪些场景使用协变和逆变呢?通常来说,参数协变后则表示——「这个参数在当前类中,只能作为函数返回值,或者只读属性」。

    1.2K21

    第8章 第8章

    第8章 通常情况类和函数,我们只需要使用具体类型即可:要么基本类型,要么自定义类。...在这一点上,跟我们第3章中所讲到类型”实现空指针安全,在思想上有着异曲同工之妙。 8.2 在类、接口和函数上使用 类、接口和方法具备重用性、类型安全和高效等优点。...实际上,我们也可以直接在类或接口中函数,或者直接在包级函数中直接声明参数。...编译错误:类型不兼容 Java中和数组不同行为,的确引起了许多混乱。就算我们使用通配符,这样写: List<?...super T 8.6 类型擦除 Java和Kotlin 实现,都是采用了运行时类型擦除方式。也就是说,在运行时,这些类型参数信息将会被擦除编译器层次上实现

    1.9K20

    带着问题高效学Android:关于Java与Kotlin你应该知道知识点

    6.什么通配符?什么PECS原则? 7.虚拟机如何实现?什么擦除? 8.kotlin与Java有什么区别? 为什么我们需要?...虚拟机如何实现?什么擦除?...为什么擦除后get不需要类型转换? 因为类型擦除问题,所以所有的类型变量最后都会被替换为原始类型。...ArrayList.get()方法,方法返回Object,说明类型擦除了。...所以不是在get方法里强转在你调用地方强转 kotlin kotlin中引入了in和out Out (协变) 如果你作为内部方法返回,那么可以用 out: interface

    1.1K00

    kotlin修炼指南7之

    面向对象编程一个非常重要方面,它出现,多态核心实现,简单说,就是可以在不同对象类型之间,使用相同代码逻辑,从而实现复用。...Kotlin,或者说Java,实际上一种伪,即只在申明时检查是否有效,在编译时,类型会被擦除,这是因为Java历史原因所导致,由于它为了兼容没有老Java版本,从而做出妥协...,因为我不关心类型,不过要注意,星投影之后返回类型,就成了「Any?」...实例化 由于Java会在编译期进行擦除,所以我们无法对来做类型判断,比如下面的代码。...函数必须内联函数,因为只有内联函数才会在编译时进行替换 加上reified关键字让编译器在该使用时进行实例化 在实战中,我们就可以利用来进一步简化代码,例如: inline fun <reified

    64530

    Kotlin 详解

    最近一段时间在网上发了一套 Kotlin 入门视频,涵盖了基础语法、面向对象、高阶函数、DSL、协程等比较有特色知识点,不过有朋友提出了疑问:这门课为什么不专门讲讲、反射和注解呢?...fun getResult(): R{        ...    } } Java/Kotlin 实现采用了类型擦除方式,这与 C# 实现不同,后者真·,前者伪·。... Kotlin 在 JVM 之上,编译之后也是字节码,机制与 Java 一样。...这也很容易解释为什么 MutableCollection 不变 Collection 协变,因为在 Kotlin 当中,前者可被修改,后者不可被修改。...逆变情形正好相反,即不可以将参数作为方法返回值。

    1.2K20

    From Java To Kotlin 2:Kotlin 类型系统与终于懂了

    --- ## 类型系统 Kotlin 类型还分为**类型**和**不可空类型**。Any 所有非空类型类型 Any? 所有类型类型。...在 Kotlin 中,不存在真正没有返回函数,所有「没有返回值」函数实质上返回类型都是 Unit,返回值也都是 Unit 这个单例对象。...### 小结 - Any 所有非空类型类型 Any? 才是所有类型类型。 - Unit 与 Java void 类型相似,代表一个函数不需要返回值; Unit?...# :让类型更加安全 Kotlin 与 Java 一样,都是一种语法糖,即只在源代码中有定义,到了class级别就被**擦除**了。...in位置,函数返回类型叫作out位置 #### 协变 :保留子类型化关系 如果在定义类和方法参数前面加上out关键词,说明这个类及方法协变,简单来说类型A类型B类型

    45650

    Android数据库高手秘籍(十),如何在Kotlin中更好地使用LitePal

    要理解实化,首先你需要知道擦除概念。 不管Java还是Kotlin,只要是基于JVM语言,基本都是通过类型擦除来实现。...也就是说对于类型约束只在编译时期存在,运行时期无法直接对类型进行检查。...Java擦除机制,使得我们不可能使用if (a instanceof T),或者T.class这样语法。 Kotlin也是基于JVM语言,因此Kotlin在运行时也是会被擦除。...这样的话也就不存在什么擦除问题了,因为Kotlin编译之后会直接使用实参替代内联方法中部分代码。 简单点来说,就是Kotlin允许将内联方法中进行实化。...is T 虽然只有一行代码,但是这里实现了一个Java中完全不可能实现功能 —— 判断参数类型是不是属于类型

    3.1K30
    领券