All*_*n W 12 casting type-inference kotlin
我有一个Java方法,如下所示:
public <T extends A & B> methodName(T arg, ...)
Run Code Online (Sandbox Code Playgroud)
其中A是类,B是接口.
在我的kotlin类中,我有另一个variable
类型C,我希望实现以下目标:
if (variable is A && variable is B) {
methodName(variable, ...)
} else {
// do something else
}
Run Code Online (Sandbox Code Playgroud)
是否可以正确投射,variable
以便它可以作为参数使用而不会出错?
目前,
variable
有一个setter方法,因此没有智能铸造.但是,我还使用本地测试了它,val
并且推断出值具有Any
无效的类型.
Kotlin不支持交叉类型.这将导致variable
要聪明投地Any
,因为这是共同的祖先A
和B
.
但是,Kotlin确实支持泛型类型约束.您可以使用它将类型参数约束为一种或多种类型.这可以在方法和类上使用.这是函数的语法(相当于你methodName
在Kotlin中的函数):
fun <T> methodName(arg: T)
where T : A,
T : B {
....
}
Run Code Online (Sandbox Code Playgroud)
您可以使用此通过创建同时扩展一个类来解决你的问题A
,并B
,然后代表这些类型的实现你的目标.像这样:
class AandB<T>(val t: T) : A by t, B by t
where T : A,
T : B
Run Code Online (Sandbox Code Playgroud)
您现在可以methodName
通过更改if-test来检查它是否是AandB<*>
:
if (variable is AandB<*>) {
methodName(variable, ...)
}
Run Code Online (Sandbox Code Playgroud)
你确实需要variable
在AandB
某个地方包装.如果你没有variable
任何地方可用的类型信息,我认为你不能这样做.
注意:AandB
该类未实现hashCode
,equals
或toString
.你可以实现它们来委托t
实现.
注2:这仅适用于如果A
和B
是接口.你不能委托给一个班级.
归档时间: |
|
查看次数: |
763 次 |
最近记录: |