首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将扩展转换为成员?

如何将扩展转换为成员?
EN

Stack Overflow用户
提问于 2019-01-12 07:36:21
回答 3查看 90关注 0票数 2

Kotlin允许您扩展泛型类的具体实例。例如,假设我有一个扩展函数为Foo<Int>.bar()Foo<String>.bar()Foo

代码语言:javascript
运行
复制
class Foo<T>(t: T) {
  val a: String = "bar"
  val b: Int = 111
}

fun Foo<Int>.bar() = a
fun Foo<String>.bar() = b

fun main(args: Array<String>) {
  val stringBar: String = Foo(1).bar()
  val intBar: Int = Foo("").bar()
}

可以在没有扩展函数的情况下实现此行为吗?如果可以,我如何将扩展函数转换为成员?可以在不重命名或更改类型签名的情况下实现吗?

EN

回答 3

Stack Overflow用户

发布于 2019-01-12 16:15:47

您可以使用具体化的泛型参数创建内联成员函数:

代码语言:javascript
运行
复制
class Foo<T>(t: T) {
    val a: String = "bar"
    val b: Int = 111

    inline fun <reified T, E> member(): E? {
        var r: E? = null
        when(T::class) {
            String::class -> r = b as E
            Int::class -> r = a as E
        }
        return r
    }
}

fun main(args: Array<String>) {
   val str = Foo(1).member<Int, String>()
   val i = Foo("").member<String, Int>()
}

但是扩展函数更适合您的情况:它们是类型安全的,更简洁和可读性更好。

票数 1
EN

Stack Overflow用户

发布于 2019-01-13 02:40:43

不,这是不可能的(当前接受的答案与您的代码的行为完全不同)。

票数 1
EN

Stack Overflow用户

发布于 2019-01-13 02:41:46

使用反射,你不需要自己做类型和属性之间的映射。

成员函数propertyValue()将返回具有泛型参数或null类型的第一个属性的值。

代码语言:javascript
运行
复制
class Foo {
    val a: String = "bar"
    val b: Int = 111

    inline fun <reified T> propertyValue() = Foo::class.memberProperties.firstOrNull {
        it.returnType == T::class.createType()
    }?.get(this)
}

Foo().propertyValue<Int>()) // 111
Foo().propertyValue<String>()) // bar
Foo().propertyValue<Double>()) // null

当然,您也可以扩展这个函数,这样它就可以为您提供所需类型T的所有属性的值(例如,如果您有多个Int属性)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54155416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档