什么是对象表达式?(Object expressions)
对象表达式用来创建匿名类的对象。匿名类是指没有使用
class
关键字显式声明的类。匿名类只能使用一次。你可以从已有类继承、拼接或者实现接口来定义一个匿名类。匿名类的实例也被称为匿名对象,因为匿名对象是由一个表达式而不是一个变量名声明的。
创建匿名对象
使用 object
关键字来创建匿名对象:
val user = object {
val firstName = "John"
val lastName = "Dev"
// 对象表达式继承自Any 类型,所以需要覆写 `toString()` 函数
override fun toString() = "$firstName $lastName"
}
匿名对象的成员可以用使用 .
点操作符访问。
匿名对象作为函数返回值和值类型
匿名对象可以用作函数返回类型。为了能够访问其成员,函数应该是局部的或者 private
类型的(但不能是 inline 类型)
private fun user() = object {
val firstName = "John"
val lastName = "Dev"
// object expressions extend Any, so `override` is required on `toString()`
override fun toString() = "$firstName $lastName"
}
如果是 public
或 private
类型的 inline 函数或者属性,返回类就变成:
Any
。如果没有声明父类型的话class Demo{
// 返回类型是 Any,无法访问firstName
fun getName() = object {
val firstName:String = "John"
}
// 返回类型是 User. 无法访问firstName
fun getUser() = object : User{
override fun getId() {}
val firstName:String = "John"
}
// 返回类型是 Address; 无法访问firstName 和 getId()
fun getAddress():Address = object : User, Address{
// explicit return type is required
override fun getId() {}
val firstName:String = "John"
}
}
原文链接:https://mangeshyadav786.medium.com/object-expressions-in-kotlin-a6bfb5ad323a