wordpress 网站打开速度慢,网站模板预览与编辑器,公司注册地址怎么变更,咨询机构泛型的基本用法
泛型主要有两种定义方式#xff0c;一种是定义泛型类#xff0c;另一种是定义泛型方法#xff0c;使用的语法结构都是。当然括号内的T并不是固定要求的#xff0c;事实上你使用任何英文字母或单词都可以#xff0c;但是通常情况下#xff0c;T是一种约定…泛型的基本用法
泛型主要有两种定义方式一种是定义泛型类另一种是定义泛型方法使用的语法结构都是。当然括号内的T并不是固定要求的事实上你使用任何英文字母或单词都可以但是通常情况下T是一种约定俗成的泛型写法。
如果要定义一个泛型类就可以这么写
class MyClassT {fun method(param: T): T {return param}}在调用MyClass类和method()方法的时候可以将泛型指定成具体的类型如下所示
val myClass MyClassInt()
val result myClass.method(123)
而如果不想定义一个泛型类只是想定义一个泛型方法只需要将定义泛型的语法结构写在方法上面就可以了如下所示
class MyClass {fun T method(param: T): T {return param}}此时的调用方式也需要进行相应的调整
val myClass MyClass()
val result myClass.methodInt(123)可以看到现在是在调用method()方法的时候指定泛型类型了。另外Kotlin还拥有非常出色的类型推导机制例如传入了一个Int类型的参数它能够自动推导出泛型的类型就是Int型因此这里也可以直接省略泛型的指定
val myClass MyClass()
val result myClass.method(123)类委托
类委托的核心思想在于将一个类的具体实现委托给另一个类去完成。但是委托也有一定的弊端如果接口中的待实现方法比较少还好要是有几十甚至上百个方法的话每个都去这样调用辅助对象中的相应方法实现写起了就非常复杂了。这个问题在Kotlin中可以通过类委托的功能来解决。
class MySetT(val helperSet: HashSetT) : SetT by helperSet {fun helloWorld() println(Hello World)override fun isEmpty() false}现在MySet就成为了一个全新的数据结构类它不仅永远不会为空而且还能打印helloWorld()至于其他Set接口中的功能则和HashSet保持一致。这就是Kotlin的类委托所能实现的功能。
委托属性
委托属性的核心思想是将一个属性字段的具体实现委托给另一个类去完成。
我们看一下委托属性的语法结构如下所示
class MyClass {var p by Delegate()}这里使用by关键字连接了左边的p属性和右边的Delegate实例这种写法就代表着将p属性的具体实现委托给了的Delegate类去完成。当调用p属性的时候会自动调用Delegate类的getValue()方法当给p属性赋值的时候会自动调用Delegate类的setValue()方法。
因此我们还得对Delegate类进行具体的实现才行代码如下所示
class Delegate {var propValue: Any? nulloperator fun getValue(myClass: MyClass, prop: KProperty*): Any? {return propValue}operator fun setValue(myClass: MyClass, prop: KProperty*, value: Any?) {propValue value}}整个委托属性的工作流程就是这样实现的现在当我们给MyClass的p属性赋值时就会调用Delegate类的setValue()方法当获取MyClass中p属性的值时就会调用Delegate类的getValue()方法。