Kotlin中“as”和“is”运算符有什么区别?
在Java中,我可以编写如下代码:
void cast(A a) { if(a instanceof Person) { Person p = (Person) a; } }
在Kotlin,我该怎么办? as
操作员还是操作员?
is X
是instanceof X
的instanceof 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 }
as
types铸造 。 但是,由于不能保证运行时安全,因此不推荐使用。 (您可能会传递错误的对象,而这些对象在编译时无法检测到。)
科特林有一个安全的演员as?
。 如果不能被铸造,它将会返回null。
val p = a as? Person p?.foo()
根据Kotline官方文件
-
通常,如果转换不可行,转换运算符将抛出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
这是答案吗?