科特林 |类型检查和智能铸造
类型检查 –
在 Kotlin 中,我们可以在运行时使用is运算符检查某个变量的类型。它是一种在运行时检查变量类型以分离不同对象的流的方法。使用 if-else 块进行类型检查的 Kotlin 程序-
Kotlin
fun main(args: Array) {
var name = "Praveen"
var age = 24
var salary = 5000.55
val employeeDetails: List = listOf(name,age,salary)
for(attribute in employeeDetails) {
if (attribute is String) {
println("Name: $attribute")
} else if (attribute is Int) {
println("Age: $attribute")
} else if (attribute is Double) {
println("Salary: $attribute")
} else {
println("Not an attribute")
}
}
}
Kotlin
fun main(args: Array) {
var name = "Praveen"
var age = 24
var salary = 5000.55
var emp_id = 12345f
val employeeDetails: List = listOf(name, age, salary, emp_id)
for (attribute in employeeDetails) {
when (attribute) {
is String -> println("Name: $attribute ")
is Int -> println("Age: $attribute")
is Double -> println("Salary: $attribute")
else -> println("Not an attribute")
}
}
}
Java
Object ob = "GeeksforGeeks";
if(ob instanceof String) {
// Explicit type casting
String str = (String) ob;
System.out.println("length of String " + str.length());
}
Kotlin
fun main(args: Array) {
val str1: String? = "GeeksforGeeks"
var str2: String? = null // prints String is null
if(str1 is String) {
// No Explicit type Casting needed.
println("length of String ${str1.length}")
}
else {
println("String is null")
}
}
Kotlin
fun main(args: Array) {
val str1: String? = "GeeksforGeeks"
var str2: String? = null // prints String is null
if(str1 !is String) {
println("String is null")
}
else {
println("length of String ${str1.length}")
}
}
输出:
Name: Praveen
Age: 24
Salary: 5000.55
说明:在这里,我们初始化三个变量name 、 age和Salary然后传递到列表中。然后,在for循环的帮助下遍历列表,在每个if-else块中,我们使用is运算符检查元素的类型并执行相应的print()语句。使用 when 表达式——我们可以很容易地用when表达式替换if-else块。我们已经在控制流文章中了解了 when 表达式。更多细节可以参考 Kotlin 中的 when 表达式。 Kotlin 类型检查程序使用 when –
科特林
fun main(args: Array) {
var name = "Praveen"
var age = 24
var salary = 5000.55
var emp_id = 12345f
val employeeDetails: List = listOf(name, age, salary, emp_id)
for (attribute in employeeDetails) {
when (attribute) {
is String -> println("Name: $attribute ")
is Int -> println("Age: $attribute")
is Double -> println("Salary: $attribute")
else -> println("Not an attribute")
}
}
}
输出:
Name: Praveen
Age: 24
Salary: 5000.55
Not an attribute
智能铸造 –
在Java或其他编程语言中,需要在访问该变量的属性之前对变量进行显式类型转换,但 Kotlin 会进行智能转换。一旦通过任何条件运算符,Kotlin 编译器就会自动将变量转换为特定的类引用。让我们以Java为例,首先,我们使用 instanceOf运算符检查变量的类型,然后将其转换为目标类型,如下所示 -
Java
Object ob = "GeeksforGeeks";
if(ob instanceof String) {
// Explicit type casting
String str = (String) ob;
System.out.println("length of String " + str.length());
}
在 Kotlin 中,智能类型转换是可用的最有趣的功能之一。我们使用is或!is运算符来检查变量的类型,编译器会自动将变量转换为目标类型,如下所示 -
科特林
fun main(args: Array) {
val str1: String? = "GeeksforGeeks"
var str2: String? = null // prints String is null
if(str1 is String) {
// No Explicit type Casting needed.
println("length of String ${str1.length}")
}
else {
println("String is null")
}
}
输出:
length of String 13
!is 运算符的使用 同样使用!is运算符我们可以检查变量。
科特林
fun main(args: Array) {
val str1: String? = "GeeksforGeeks"
var str2: String? = null // prints String is null
if(str1 !is String) {
println("String is null")
}
else {
println("length of String ${str1.length}")
}
}
输出:
length of String 13
注意:当编译器不能保证变量在检查和使用之间不能改变时,智能转换不起作用。智能演员表适用于以下规则:
- val局部变量始终有效,除了局部委托属性。
- val属性仅在属性为私有或内部或在声明属性的同一模块中执行检查时才有效。智能转换不适用于开放属性或具有自定义 getter 的属性。
- var局部变量仅当变量在检查和使用之间没有被修改,没有在修改它的 lambda 中捕获,并且不是本地委托属性时才有效。
- var属性 - 永远不会起作用,因为可以随时修改变量。