是否可以通过类型转换来满足Kotlin中的多种类型约束?
说我有以下情况,但要避免将类型强制转换为类C
(以防多个类实现A
和B
,或者我不知道类型{{ 1}}):
C
是否可以同时向interface A
interface B
class C: A, B
fun <T> foo(bar: T) where T: A, T: B {
}
和A
进行类型转换?聪明的演员似乎不允许这样做。我可以手动投射吗?
B
我知道可以通过创建一个同时继承val c = C()
foo(c) // works
val d: Any = c
if (d is A && d is B) {
foo(d) // smart cast doesn't work here, compiler error
}
// Something like this maybe?
foo(d as A && B)
和A
的新接口,然后使用它来实现,但是如果我不控制所涉及的类,那可能是不可能的。
谢谢
答案 0 :(得分:2)
该类型必须显式实现所需的接口,并且由于Any
不能同时为B
和A
(即使它同时实现了两者),因此必须有第三种类型,例如C
。
这个类似的问题可以解决。 Is intersection casting possible in Kotlin?
因此实现T
和A
的任意类型B
可以被这样识别,但是is
和as
不能直接与{{ 1}},这样就无法在没有某种显式实现包装器的情况下满足您的函数类型约束。