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在可能的情况下执行智能铸造,所以在检查类型之后不需要额外的铸造:

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

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

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

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

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

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

    根据Kotline官方文件

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

       val x: String = y as String 

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

      val x: String? = y as String? 

    所以这里使用而不是as

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

    as用于显式类型转换

     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 

    这是答案吗?