问题描述
我正在调查Kotlin import sys
sys.setrecursionlimit(10**8)
T = dict()
def downToZero(n):
if n in T : return T[n]
if n==1 : return 1
T[n] = 1+downToZero(n-1)
return T[n]
x = int(input())
print(downToZero(x))
/ MutableStateFlow
,并想在通用基类中声明我的StateFlow
,如下所示:-
MutableStateFlow
我遇到的问题是MutableStateFlow具有强制性的初始值。
我看不到如何提供类型“ class MyBaseClass<S> {
private val internalState = MutableStateFlow<S>(//WHAT GOES HERE????//)
val state: StateFlow<S>
get() = internalState
}
”的通用初始值
是否可以使用这种采用通用基类实例变量的方法?
解决方法
您可以从类似的派生类中获取默认的初始状态值,
abstract class MyBaseClass<S> {
abstract val initialState: S
private val internalState = MutableStateFlow<S>(initialState)
val state: StateFlow<S>
get() = internalState
}
,
在Harshith Shetty的基础上回答,我所做的不同之处是将internalState
初始化为惰性,以便避免accessing non-final property in constructor
警告
abstract class MyBaseClass<S> {
abstract val initialState: S
private val internalState: MutableStateFlow<S> by lazy { MutableStateFlow(initialState) }
val state: StateFlow<S>
get() = internalState
}
顺便说一句,没有初始值就无法初始化MutableStateFlow。如果您绝对不希望使用初始值,请使用ConflatedBroadcastChannel
。
例如
val internalState: ConflatedBroadcastChannel<S> = ConflatedBroadcastChannel()