Kotlin 为什么扩展类有“by”并在函数定义中具体化
遇到一个带有类和函数的示例,并试图理解其中的koltin语法 此IMeta按数据项执行的操作是什么?查看并不了解如何在派生类中使用by 为什么内联fun getDataItem中需要具体化?如果有人能提供一个样本来解释具体化的过程Kotlin 为什么扩展类有“by”并在函数定义中具体化,kotlin,kotlin-reified-type-parameters,Kotlin,Kotlin Reified Type Parameters,遇到一个带有类和函数的示例,并试图理解其中的koltin语法 此IMeta按数据项执行的操作是什么?查看并不了解如何在派生类中使用by 为什么内联fun getDataItem中需要具体化?如果有人能提供一个样本来解释具体化的过程 既然你问了两个问题,我将分别回答 Kolin中的by关键字用于委托。有两种授权: 1有时称为班级委派 这允许您实现接口,并将对该接口的调用委托给具体对象。如果您想扩展接口,但不想实现接口的每一个部分,这将非常有用。例如,我们可以通过授权列表来扩展它,并允许调用方为我们
既然你问了两个问题,我将分别回答 Kolin中的by关键字用于委托。有两种授权: 1有时称为班级委派 这允许您实现接口,并将对该接口的调用委托给具体对象。如果您想扩展接口,但不想实现接口的每一个部分,这将非常有用。例如,我们可以通过授权列表来扩展它,并允许调用方为我们提供列表的实现 二, 这允许您执行类似的工作,但需要使用属性。我最喜欢的例子是lazy,它允许您懒洋洋地定义属性。在您引用该属性之前,不会创建任何内容,并且缓存结果以便将来更快地访问 从Kotlin文档中:
val lazyValue: String by lazy {
println("computed!")
"Hello"
}
为什么内联fun getDataItem中需要具体化?如果有人能提供一个样本来解释具体化的过程
有一些好的,但我会尽量把它浓缩一点
Kotlin中的reified关键字用于绕过JVM对泛型使用类型擦除这一事实。这意味着在运行时,每当您引用泛型类型时,JVM都不知道实际的类型是什么。这只是编译时的事情。所以在你的例子中T。。。JVM不知道没有具体化意味着什么,我将对此进行解释
您将在示例中注意到,您还使用了inline关键字。这就告诉Kotlin,与其在引用函数时调用函数,不如直接内联插入函数体。在某些情况下,这可能更有效。因此,如果Kotlin已经准备在编译时复制我们的函数体,为什么不复制T表示的类呢?这就是使用物化的地方。这告诉Kotlin引用T的实际具体类型,并且只适用于内联函数
如果要从示例中删除具体化关键字,则会出现一个错误:无法检查已擦除类型的实例:T。通过具体化,Kotlin知道实际类型T是什么,让我们可以安全地进行此比较并生成智能强制转换。,thx!不知道如何使用“by”来实现传递参数,太好了!
interface IMeta {
fun getType() : String
fun getUUIDId() : String
fun getDataId(): String?
}
class DerivedData : IMeta {
override fun getType(): String {
return "" // stub
}
override fun getUUIDId(): String {
return "" // stub
}
override fun getDataId(): String? {
return "" // stub
}
}
class ExtendedList(someList: List) : List by someList {
// Override anything from List that you need
// All other calls that would resolve to the List interface are
// delegated to someList
}
val lazyValue: String by lazy {
println("computed!")
"Hello"
}