我正在将旧代码库从 thirden
向后移植库迁移到使用 java.time
。有一个测试方法不再有效,但我不知道如何修复它。
这是更改之前的类。编译正确:
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import org.junit.Before
import org.junit.Rule
import org.threeten.bp.ZoneId
import org.threeten.bp.zone.TzdbZoneRulesProvider
import org.threeten.bp.zone.ZoneRulesProvider
open class BaseAvailabilityTest {
@get:Rule
val rule = InstantTaskExecutorRule()
@Before
open fun setUp() {
if (ZoneRulesProvider.getAvailableZoneIds().isEmpty()) {
val stream = this.javaClass.classLoader?.getResourceAsStream("TZDB.dat")
stream.use(::TzdbZoneRulesProvider).apply {
ZoneRulesProvider.registerProvider(this)
}
}
zoneId = ZoneId.of("America/Los_Angeles")
}
}
但是当我将 thirden
导入切换到 java.time
时,如下所示:
import java.time.ZoneId
import java.time.zone.TzdbZoneRulesProvider
import java.time.zone.ZoneRulesProvider
然后 Android Studio 显示错误:
Type mismatch
Required: (TypeVariable(T))->TypeVariable(R)
Found: KFunction0<TzdbZoneRulesProvider>
我找不到任何可以解决此问题的内容。谁能帮我理解这里发生了什么?
最佳答案
您不需要显式注册 tzdb 提供程序。这是 JVM 的默认提供程序,如 JavaDocs 中所述。 .
The Java virtual machine has a default provider that provides zone rules for the time-zones defined by IANA Time Zone Database (TZDB). If the system property java.time.zone.DefaultZoneRulesProvider is defined then it is taken to be the fully-qualified name of a concrete ZoneRulesProvider class to be loaded as the default provider, using the system class loader. If this system property is not defined, a system-default provider will be loaded to serve as the default provider.
事实上,TzdbZoneRulesProvider
是 java.time.zone
中的包私有(private)类,因此您无论如何都无法访问它。
这本质上意味着您可以完全删除此if
:
if (ZoneRulesProvider.getAvailableZoneIds().isEmpty()) {
val stream = this.javaClass.classLoader?.getResourceAsStream("TZDB.dat")
stream.use(::TzdbZoneRulesProvider).apply {
ZoneRulesProvider.registerProvider(this)
}
}
如果您的测试依赖于 tzdb 的特定版本(例如在非常罕见的情况下,例如 this post ),则可以使用 timezone updater tool更改 JDK 中的 tzdb 版本。描述了一个示例 here .
关于kotlin - TzdbZoneRulesProvider 在 java.time 中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75622472/