在Kotlin中可以交叉投射吗?

我有一个像Java这样的方法:

public <T extends A & B> methodName(T arg, ...) 

其中A是一个类,B是一个接口。

在我的kotlin类中,我有另一个C类型的variable ,我希望实现以下功能:

 if (variable is A && variable is B) { methodName(variable, ...) } else { // do something else } 

是否有可能正确地投下variable以便它可以作为参数没有错误?

目前,该variable具有setter方法,所以智能铸造不可用。 但是,我也用一个本地的val测试它,并且这个值被推断为具有类型Any而不起作用。

Kotlin不支持交集类型。 这导致variable被智能地转换为Any ,因为这是AB的共同祖先。

但是,Kotlin确实支持泛型类型约束。 你可以使用这个来限制一个或多个类型的类型参数。 这可以用于方法和类。 这是函数的语法(相当于Kotlin中的methodName ):

 fun <T> methodName(arg: T) where T : A, T : B { .... } 

你可以通过创建一个扩展AB的类来解决你的问题,然后把这些类型的实现委托给你的对象。 喜欢这个:

 class AandB<T>(val t: T) : A by t, B by t where T : A, T : B 

你现在可以通过改变你的if-test来检查它是否是AandB<*>来调用methodName

 if (variable is AandB<*>) { methodName(variable, ...) } 

你确实需要把variable包装在AandB 。 我不认为你可以做到这一点,如果你没有任何可用的variable的类型信息。

注意: AandB类不执行hashCodeequalstoString 。 你可以实现它们来委托实现。

注2:这只适用于AB是接口。 你不能委托给一个班级。