在Java中,我可以编写如下代码:
void cast(A a) {
if(a instanceof Person) {
Person p = (Person) a;
}
}
在Kotlin,我该怎么办?
使用as
运算符或is
运算符?
答案 0 :(得分:18)
is X
相当于instanceof X
foo as X
相当于((X) foo)
此外,Kotlin尽可能执行智能投射,因此在使用is
检查类型后无需额外投射:
open class Person : A() {
val foo: Int = 42
}
open class A
然后:
if (p is Person) {
println(p.foo) // look, no cast needed to access `foo`
}
答案 1 :(得分:8)
is
是检查类型。但Kotlin有智能投射,这意味着您可以在类型检查后使用a
Person
。
if(a is Person) {
// a is now treated as Person
}
as
是投射类型。但是,建议不要使用as
,因为它不保证运行时的安全性。 (您可以传递在编译时无法检测到的错误对象。)
Kotlin有一个安全的演员as?
。如果它不能被转换,它将返回null。
val p = a as? Person
p?.foo()
答案 2 :(得分:1)
根据Kotline官方文件
通常,如果无法进行强制转换,则强制转换运算符会抛出异常。因此,我们称之为不安全。 Kotlin中的不安全演员阵容由中缀操作员完成
val x: String = y as String
请注意,null不能转换为String,因为此类型不可为空,即如果y为null,则上面的代码会抛出异常。为了匹配Java强制语义,我们必须在右侧有可空类型,如:
val x: String? = y as String?
所以这里使用是而不是
fun cast(a: A) {
if (a is Person) {
val p = a as Person
}
}
答案 3 :(得分:1)
as
用于显式类型转换
val p = a as Person;
is
与Java中的instanceof
完全相同。用于检查对象是否是类的实例
if(a is Person) {
// a is an instance of Person
}
您也可以使用!is
,因为它不是类的对象
fun cast(a: A) {
if(a is Person) {
val p = a as Person;
}
}
答案 4 :(得分:1)
操作员正在检查数据类型
但按原样转换为某种类型,例如将Int转换为String
答案 5 :(得分:0)
所以
if(a is Person){
a as Person
}else{
null
}
等效
a as? Person
这是答案吗?
答案 6 :(得分:0)
您可以使用 is 运算符
fun cast(a:A){
if (a is Person){
var person = a
}
}
答案 7 :(得分:0)