gpt4 book ai didi

generics - Kotlin 合约 : assert instance on reified type parameter

转载 作者:行者123 更新时间:2023-12-02 20:15:48 30 4
gpt4 key购买 nike

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

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

Assertions.assertThat(value).isInstanceOf(T::class.java)
}

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

合约描述错误:合约中禁止引用类型参数

还有其他方法可以实现此行为吗?这里有什么问题?这最终可能吗?

(使用 Kotlin v1.3)

最佳答案

这已经困扰了我几个小时,特别是因为这是可能的:

val x: Any = "string"
require(x is String)
val len = x.length

编译器显然能够理解这些,因此这可能是合约本身的限制。

我花了一段时间试图想出一些解决方法。供引用:

@UseExperimental(ExperimentalContracts::class)
inline fun <reified T> assertIsInstance(value: Any?) {
contract {
returns() implies T::class.isInstance(value))
}
if(value !is T){
throw java.lang.IllegalArgumentException("Incorrect type");
}
}

“不支持的构造”

@UseExperimental(ExperimentalContracts::class)
inline fun <reified T> assertIsInstance(value: Any?, condition: Boolean = value is T) {
contract {
returns() implies condition
}
if(!condition)
throw IllegalArgumentException("Incorrect type");
}

编译,但不启用智能转换。其背后的最初动机是在合约前面放置一个 bool 值,但合约需要成为函数的第一部分,这使得这是不可能的。你不妨取消契约(Contract);在这种情况下它是没有用的。

这是我最后一次尝试:

@UseExperimental(ExperimentalContracts::class)
inline fun assertIsInstance(value: Any?, cls: KClass<out Any>) {
contract {
returns() implies (cls.isInstance(value))
}
if(!cls.isInstance(value))
throw IllegalArgumentException("");
}

另一个“不受支持的构造”。

不知怎的,我最终得到了这个:

@UseExperimental(ExperimentalContracts::class)
inline fun assertIsInstance(value: Any?) {
contract {
returns() implies (value.hashCode() == 0)
}
if(value.hashCode() != 0)
throw java.lang.IllegalArgumentException();
}

但这会产生一个新错误:合约描述中只允许引用参数

TL;博士:

看起来你不能。像我在第二个示例中所做的那样潜入它不会触发智能转换,并且由于各种编译器错误,其余部分不起作用。

至少目前看来还没有办法。您当然可以在 Kotlin 存储库中打开一个问题并请求类似的内容,但目前看来这是不可能的。

关于generics - Kotlin 合约 : assert instance on reified type parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53205855/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com