Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 为什么扩展类有“by”并在函数定义中具体化_Kotlin_Kotlin Reified Type Parameters - Fatal编程技术网

Kotlin 为什么扩展类有“by”并在函数定义中具体化

Kotlin 为什么扩展类有“by”并在函数定义中具体化,kotlin,kotlin-reified-type-parameters,Kotlin,Kotlin Reified Type Parameters,遇到一个带有类和函数的示例,并试图理解其中的koltin语法 此IMeta按数据项执行的操作是什么?查看并不了解如何在派生类中使用by 为什么内联fun getDataItem中需要具体化?如果有人能提供一个样本来解释具体化的过程 既然你问了两个问题,我将分别回答 Kolin中的by关键字用于委托。有两种授权: 1有时称为班级委派 这允许您实现接口,并将对该接口的调用委托给具体对象。如果您想扩展接口,但不想实现接口的每一个部分,这将非常有用。例如,我们可以通过授权列表来扩展它,并允许调用方为我们

遇到一个带有类和函数的示例,并试图理解其中的koltin语法

此IMeta按数据项执行的操作是什么?查看并不了解如何在派生类中使用by

为什么内联fun getDataItem中需要具体化?如果有人能提供一个样本来解释具体化的过程


既然你问了两个问题,我将分别回答

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"
}