目前正在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 .