Kotlin 合同:在具体化的类型参数上断言实例

s1m*_*nw1 7 generics kotlin assertj kotlin-reified-type-parameters kotlin-contracts

我正在尝试编写一个断言函数来检查给定的对象是否属于某个类型T

@UseExperimental(ExperimentalContracts::class)
inline fun <reified T> assertIsInstance(value: Any?) {
    contract {
        returns() implies (value is T)
    }

    Assertions.assertThat(value).isInstanceOf(T::class.java)
}
Run Code Online (Sandbox Code Playgroud)

该函数使用 AssertJ 来做具体的断言,但我愿意让编译器知道在它执行后,valueis 的类型T是可以进行智能广播的。这似乎不起作用,因为:

Error in contract description: references to type parameters are forbidden in contracts

有没有另一种方法来实现这种行为?这里有什么问题?这最终会成为可能吗?

(使用 Kotlin v1.3)

小智 3

在某些时候,对于 IDE 中对此类结构的支持存在一些(深层次的技术)担忧,但这种限制将来可能会放宽。