目前正在try 优化两个函数之间的代码使用,这两个函数执行完全相同的事情,但接受不同的输入,但具有相同的JVM签名.

这些是基本的帮助器,通过 for each 函数使用不同的名称可以很容易地解决这个问题,但当前的目标是使它们更直观.

示例函数如下:

函数,该函数使用从当前类实例继承的默认<T>类型:

suspend inline fun forGeneric(collector: FlowCollector<T>) {
    sharedFlow.collect(collector)
}

函数,该函数接受扩展<T>的特定<K>类型:

suspend inline fun <reified K : T> forSpecific(collector: FlowCollector<K>) {
    sharedFlow.filterIsInstance<K>().collect(collector)
}

其中sharedFlow是内部SharedFlow字段.

它们是从继承它们的类中使用的,如下所示:

MyClass.forGeneric { it: MyGenericValue ->
    when (it) {
        is MySpecificValue -> (...)
        is (...)
        // do stuff here
    }
}
MyClass.forSpecific<MySpecificValue> { it: MySpecificValue ->
    // do stuff here
}

其中MyGenericValue<T>,MySpecificValue<K>,从MyGenericValue开始延伸.

我们的目标是两者具有完全相同的名称,但唯一的区别是开发人员是否指定了类型.如果未指定类型,则默认情况下使用"main"父类型,否则使用指定的类型.

使用上述相同方案进行try 的示例:

MyClass.for { it: MyGenericValue ->
    when (it) {
        is MySpecificValue -> (...)
        is (...)
        // do stuff here
    }
}
MyClass.for<MySpecificValue> { it: MySpecificValue ->
    // do stuff here
}

基本函数如下所示(我知道这是不正确的,但这只是一个示例):

suspend inline fun <reified K : T> forSpecific(collector: FlowCollector<K>) {
    if (K == null) {
        sharedFlow.collect(collector)
    } else {
        sharedFlow.filterIsInstance<K>().collect(collector)
    }
}

我甚至不确定这是否可能,但事实证明,搜索这个主题是一项困难的任务,因为我在该领域缺乏深入的知识,总是导致我在StackOverflow中找到通用的或无关的例子/答案.

我知道可能有一种方法也可以通过将类型类作为函数参数传递而不是实例化类型(<...>fun(T::java.class, ...))来解决这个问题,但这不是这里的真正目标,如果可能的话,首选使用上面的 struct .

推荐答案

这看起来可能有点奇怪,但这是我能想到的唯一解决办法.您可以将未使用的伪Unit参数添加到其中一个重载:

suspend fun forSomething(collector: FlowCollector<T>) {
    sharedFlow.collect(collector)
}

suspend inline fun <reified K: T> forSomething(unit: Unit = Unit, collector: FlowCollector<K>) {
    sharedFlow.filterIsInstance<K>().collect(collector)
}

Kotlin相关问答推荐

最好的方法来创建一个 map 在kotlin从两个列表

在Kotlin项目中使用Free Fair AspectJ插件(使用Gradle)

访问者闭包中的Kotlin序列yield 率

在kotlin中匹配多个变量

有什么方法可以要求在 kotlin 中的类型参数上进行注释?

如何连接两个 kotlin 流?

使用 LazyListScope 嵌套可组合项

Kotlin JS JSON 反序列化

Android 导航组件 - 向上导航打开相同的片段

有没有办法重用 Job 实例?

如何使用 gradle 脚本 Kotlin 构建文件构建可运行的 ShadowJar?

如何在 Kotlin 中使用 volatile

如何在 Kotlin 中为变量设置监听器

作为 Kotlin 中的函数的结果,如何从 Firestore 数据库返回列表?

不推荐使用仅限生命周期的LifecycleEvent

可以在函数参数中使用解构吗?

将字符串转换为HashMap的最简单方法

为什么在 Kotlin 中return可以返回一个return?

如何在 kotlin 中创建重复对象数组?

如何判断数据是否插入到房间数据库中