类型转换以满足多种类型约束

mhs*_*wtf 5 kotlin

是否可以通过类型转换来满足Kotlin中的多种类型约束?

假设我遇到以下情况,但想避免将类型强制转换为类C(以防多个类实现AB,或者我不知道type C):

interface A
interface B

class C: A, B

fun <T> foo(bar: T) where T: A, T: B {

}
Run Code Online (Sandbox Code Playgroud)

是否有可能强制转换AB同步?聪明的演员似乎不允许这样做。我可以手动投射吗?

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)
Run Code Online (Sandbox Code Playgroud)

我知道可以通过创建一个同时继承自A和的新接口,B然后使用该接口来实现,但是如果我不控制所讨论的类,则可能无法实现。

谢谢

eva*_*nal 2

该类型必须显式实现所需的接口,并且由于Any不能同时是Band A(即使它实现了两者),因此必须有第三种类型,例如C.

这个类似的问题有一个通用的解决方法;Kotlin 中可以进行交叉转换吗?

T因此,实现A和的任意类型B都可以被识别,但is不能as直接组合&&,这使得如果没有某种显式实现包装器就无法满足函数类型约束。