Kotlin中“as”和“is”运算符有什么区别?

在Java中,我可以编写如下代码:

void cast(A a) { if(a instanceof Person) { Person p = (Person) a; } } 

在Kotlin,我该怎么办? as操作员还是操作员?

is Xinstanceof Xinstanceof X的等价物

foo as X等于((X) foo)

此外,Kotlin在可能的情况下执行智能铸造,所以在检查types之后不需要额外的铸造:

 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` } 

是types检查 。 但是Kotlin有聪明的演员。 这意味着你可以在types检查之后使用类似的Person

 if(a is Person) { // a is now treated as Person } 

astypes铸造 。 但是,由于不能保证运行时安全,因此不推荐使用。 (您可能会传递错误的对象,而这些对象在编译时无法检测到。)

科特林有一个安全的演员as? 。 如果不能被铸造,它将会返回null。

 val p = a as? Person p?.foo() 

根据Kotline官方文件

  1. 通常,如果转换不可行,转换运算符将抛出exception。 因此,我们称之为不安全的。 Kotlin中不安全的演员是由中缀操作员完成的

     val x: String = y as String 

请注意,null不能转换为String,因为此types不可为空,即如果y为null,则上面的代码将引发exception。 为了匹配Java转换语义,我们必须在右手边有空的types,如:

  val x: String? = y as String? 

所以这里使用而不是as

  fun cast(a: A) { if (a is Person) { val p = a as Person } } 

as用于显式types转换

 val p = a as Person; 

与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; } } 

所以

 if(a is Person){ a as Person }else{ null } 

当量

 a as? Person 

这是答案吗?