同时导入类与扩展函数及自定义类运算符重载技术问询
嘿,我来帮你解决这两个Kotlin的问题,都是日常开发里很常见的场景,咱们一个个捋清楚:
问题1:如何同时导入类及其扩展函数?
这个得看你的类和扩展函数的位置关系,分两种情况处理:
如果扩展函数和类在同一个包/同一个文件里:
你只需要导入这个类就行,同包的扩展函数会自动被包含进来,不用额外写导入语句。比如:import com.example.Integer // 现在Integer的成员函数+同包扩展函数都能直接用如果扩展函数在不同的包里:
你可以选择分别导入类和指定的扩展函数,或者用星号语法一次性导入该类的所有扩展函数。举个例子,假设Integer类在com.example,扩展函数放在com.example.extensions包下:// 方式1:单独导入类和某个扩展函数 import com.example.Integer import com.example.extensions.Integer.plus // 导入指定的扩展plus函数 // 方式2:一次性导入该类的所有扩展函数 import com.example.Integer import com.example.extensions.Integer.* // 方式3:直接导入整个扩展包(如果包里只有这个类的扩展) import com.example.extensions.*
要是遇到命名冲突,还可以用as给导入内容起别名:
import com.example.Integer import com.example.other.Integer as OtherInteger import com.example.extensions.Integer.plus as plusExtension
问题2:为以自定义类对象作为参数的外部类重载运算符?
从你的代码片段来看,你已经给Integer实现了和自身、和Int的运算符重载,但应该是卡在了反向运算的场景——比如想写2 + Integer(3)这种左操作数是Int(外部类)、右操作数是你的Integer对象的代码,对吧?
这时候核心思路是:给外部类(比如这里的Int)写扩展运算符函数,因为Kotlin的运算符解析是基于左操作数类型的。咱们来补全你的代码:
首先是你的Integer类:
package com.example class Integer(var value: Int) { operator fun plus(x: Integer) = Integer(value + x.value) operator fun plus(x: Int) = Integer(value + x) operator fun minus(x: Integer) = Integer(value - x.value) // 可以继续实现其他运算符,比如minus(Int)等 }
然后,为了支持Int + Integer这类反向运算,给Int类扩展对应的运算符:
package com.example // 给Int扩展plus方法,参数为自定义Integer类 operator fun Int.plus(x: Integer): Integer { return Integer(this + x.value) } // 同理,支持Int - Integer的话就写对应的扩展函数 operator fun Int.minus(x: Integer): Integer { return Integer(this - x.value) }
现在你就能自由使用各种组合的运算了:
fun main() { val a = Integer(1) val b = Integer(2) println((a + b).value) // 3,调用Integer.plus(Integer) println((a + 5).value) // 6,调用Integer.plus(Int) println((5 + a).value) // 6,调用Int.plus(Integer) println((5 - a).value) // 4,调用Int.minus(Integer) }
简单总结:当需要让外部类(比如Int、String这类你没法修改源码的类)和自定义类进行运算时,就给外部类写对应的扩展运算符函数,参数传入你的自定义类,返回值可以根据业务需求设置(这里返回Integer,也可以返回Int)。
内容的提问来源于stack exchange,提问作者alexanders916
相关产品推荐
相关产品推荐

