在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
,因为这是A
和B
的共同祖先。
但是,Kotlin确实支持泛型类型约束。 你可以使用这个来限制一个或多个类型的类型参数。 这可以用于方法和类。 这是函数的语法(相当于Kotlin中的methodName
):
fun <T> methodName(arg: T) where T : A, T : B { .... }
你可以通过创建一个扩展A
和B
的类来解决你的问题,然后把这些类型的实现委托给你的对象。 喜欢这个:
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
类不执行hashCode
, equals
或toString
。 你可以实现它们来委托实现。
注2:这只适用于A
和B
是接口。 你不能委托给一个班级。