Kotlin---类型判断与强转

准备工作

准备两个类PersonChild Person类如下:

 open class Person(name: String, age: Int) {
    var mName    = name
    var mAge = age

    open fun printInfo(): Int = Log.e("TAG", "$mName.....$mAge")
}

Child类如下:

class Child(name: String, age: Int, canWalk: Boolean) : Person(name, age) {
    var mCanWalk = canWalk

    override fun printInfo(): Int = Log.e("Child", "Child...$mName...$mAge...$mCanWalk")

    fun printCanWalk() = Log.e("TAG", "Child Can Walk....$mCanWalk")
}

类型判断

在java中使用instanceof来判断类型。而在Kotlin中,则是使用is来判断:

var person = Person("Bob", 30)
if (person is Child) {
     person.printCanWalk()
} else {
     person.printInfo()
}

可以看到在判断完类型后,可以直接调用该类型的函数。这部分是编译器替我们完成的,并且在条件表达式中同样可以使用

if (person is Child && person.mCanWalk) {
    person.printCanWalk()
}

类型强转

当有确定类型当时候,就可以使用as进行强制转换了:

var person = Person("Bob", 30)
var child = person as Child

但是如果在强转当时候,发现类型不匹配,则会报Exception。而如果是null类型的对象强转时,可以通过?来允许可空数据进行判断

var person : Any = Person("Bob", 30)
var child: Child? = person as? Child
child?.printCanWalk()

这样的话,当类型判断为空时,则会返回null,而在执行child?.printCanWalk()语句时,会判断child是否为空,如果为空的话,则不会执行,如果不为空的话,就会执行。

而将person标为Any,可以相当于Java中的Object,为了去除编译器的警告。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术小站

c++(三)

函数在调用之前必须进行声明或者定义,函数的声明:返回值类型 函数名(参数类型 参数名称.......);其中参数名称可以省略;

12330
来自专栏自学笔记

Data Structure_数组_栈_队列_链表_霍夫曼数组栈队列链表哈夫曼

这就表示一个数组,这个数组有八个元素存放。对于元素的获取,主要就是通过下标获取,所以索引对于数组是很重要的,这个索引可以是有意义的,也可以是没有意义的。比如ar...

8320
来自专栏Bingo的深度学习杂货店

Q125 Valid Palindrome

Given a string, determine if it is a palindrome, considering only alphanumeric c...

33250
来自专栏偏前端工程师的驿站

JS魔法堂:再识Number type

Brief                                   本来只打算理解JS中0.1 + 0.2 == 0.300000000000000...

23950
来自专栏一个会写诗的程序员的博客

第11章 运算符重载与约定第11章 运算符重载与约定

我们在《第2章 Kotlin 语法基础》中已经学习过关于运算符的相关内容,本章将继续深入探讨Kotlin中的运算符的重载与约定。

16540
来自专栏Android相关

Kotlin---接口与继承

同样在Kotlin中也有接口的概念,与Java不同的是,Kotlin中的接口可以定义变量,但是不能为变量提供构造函数,也可以实现函数体,如果没有实现的函数,默认...

17830
来自专栏Ryan Miao

java中复制对象通过反射或序列化

在使用缓存读取数据后修改发现缓存被修改。于是找了下复制对象的方法。 关于对象克隆 ---- 按我的理解,对象是包含引用+数据。通常变量复制都是将引用传递过去。比...

34190
来自专栏一个会写诗的程序员的博客

Clojure使用Java方法Clojure使用Java方法

Clojure有个很强大的功能,就是你可以使用Lisp语言风格无缝调用java api(java interop).这无疑是如虎添翼.

12220
来自专栏web前端-

JavaScript运算符和控制语句

语法: switch(n)  {      case 1:      执行代码块 1      break;      case 2:      执行代码块 2...

9920
来自专栏Java3y

给女朋友讲解什么是Optional【JDK 8特性】

前两天带女朋友去图书馆了,随手就给她来了一本《与孩子一起学编程》的书,于是今天就给女朋友讲解一下什么是Optional类。

7930

扫码关注云+社区

领取腾讯云代金券