有什么区别" as"和"是" Kotlin的经营者?

时间:2017-11-02 03:50:43

标签: casting kotlin

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

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

在Kotlin,我该怎么办? 使用as运算符或is运算符?

8 个答案:

答案 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官方文件

  1. 通常,如果无法进行强制转换,则强制转换运算符会抛出异常。因此,我们称之为不安全。 Kotlin中的不安全演员阵容由中缀操作员完成

    val x: String = y as String
    
  2. 请注意,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)

德米特里·杰梅洛夫(Dmitry Jemerov)和斯维特拉娜·伊萨科娃(Svetlana Isakova)的“行动中的科特林”就是一个很好的例子,它是: enter image description here