摘要:使用场景:将map中key-value映射到对象的属性中,这通常在解析json 数据时用到
阅读全文
摘要:输出: 总结:使用vetoable函数,响应器会返回一个布尔值,如果返回true,表示允许赋值,false则保留原来的值
阅读全文
摘要:所谓可观察属性就是当属性变化时可以拦截其变化,实现观察属性值变化的委托函数是Delegates.observable.该函数接受二个参数,第一个是初始化值,第2个属性值变化事件的响应器.每次我们向属性赋值时,响应器都会被调用,响应器函数的三个函数,被赋值的属性,赋值前旧属性值,以及赋值后的新属性值
阅读全文
摘要:lazy函数,接受一个lambda表达式作为参数,返回一个Lazy<T> 类型的实例,这个实例可以作为委托,实现惰性加载属性;第一次调用get时,将会执行从lazy函数传入的lambda表达式,然后会记住这次结果,以后所有对get调用都只会简单的返回以前记住的结果 输出 默认情况下,惰性加载属性的执
阅读全文
摘要:输出: 上面代码冗余,所谓委托类,就是一个包含getValue和setValue函数的类,这两个函数operator声明 在使用委托类时,需要by关键字,创建委托类实例的代码放在by后面 如下 输出结果和上面一样!
阅读全文
摘要:可以看出:demo类使用by关键字将base类的printL函数委托给了一个对象.该对象需要通过demo类的主构造器传入,而且该对象类必须实现base接口!
阅读全文
摘要:在kotlin中并没有静态类成员的概念,但并不等于实现类似于静态类成员的功能,陪伴对象可以解决这个问题 注意:虽然陪伴对象的成员看起来像其他语言中的静态成员,但是在运行期间,这些成员仍然是真正的对象的实例的成员,与静态成员不同,不过使用@jvmStatic进行注释,kotlin编译器会将其编译成by
阅读全文
摘要:在java中,匿名对象访问封闭作用域内的变量,需要用final 声明变量在java8中,如果只是使用封闭作用域内的变量,该变量并不需要使用final,但是一旦修改值,就需要使用final 来声明变量.
阅读全文
摘要:总结:匿名对象只能用在本地函数或者private声明中,如果将匿名对象用于public函数的返回值,或者public 属性的类型,那么kotlin编译器会将这些函数或者属性的返回类型重新定义 为匿名对象的父类型.如果匿名对象没有实现任何接口,没有从任何类继承,那么父类型就是Any,因此在匿名对象中的
阅读全文
摘要:在kotlin中,也有类似的功能,但不是匿名类,而是对象,需要使用object关键字,对象要继承的列需要与object之间的冒号(:)分隔. 对象和类一样,只能有一个父类,但可以实现多个接口 如果只想建立一个对象,不想任何的类型,也不实现任何的接口,如下:
阅读全文
摘要:冒号之后指定的类型就是泛型参数的上界,对于泛型参数T,只允许使用Comparable<T>的子类型
阅读全文
摘要:调用泛型的函数,应该在函数名称之后指定调用端类型参数:
阅读全文
摘要:如果一个泛型类型中存在多个类型的参数,那么每个类型的参数都可以单独投射,例如:如果类型定义为:"interface Function<in T,out>",那么可以出现以下的几种星号投射:
阅读全文
摘要:上面是有out类型投射,我们声明的含义:from 不是一个单纯的数组,而是一个被限制投射的数组,也可以使用in关键字来投射一个类型
阅读全文
摘要:在java泛型中中会有 ? extends E 可以解决类似于List<String> 赋给List<Object> 的问题,但是在kotlin泛型中并没有提供通配符,而是out和in关键字,用out声明的泛型占位符只能在获取泛型类型赋值,如函数的返回值,用in声明的泛型占位符只能在设置泛型类型值得
阅读全文
摘要:class box (t :T){ var vlaue =t } fun main(arg: Array) { val box1:box = box(20) val box2:box = box("haha") println(box1.vlaue) print(box2.vlaue) }
阅读全文
摘要:封闭类是kotlin 的语法糖,也可以理解为枚举的扩展,前面scaled关键字标识,可以有任意多个子类或者对象,封闭类的值只能是这些子类和对象,使用封闭类好处主要是when表达式,不需要使用else形式
阅读全文
摘要:copy()该函数的作用就是复制数据类的实例
阅读全文
摘要:建立User类 如果重写类tostring和equals方法 这样可以满足我们的要求,但是如果每个表示数据的类都要重写这两个方法,都要加属性,很麻烦 数据类规定,属性要通过主构造器指定,而且数据类要在class关键字前面加data.因此,如果前面的User类用数据类的写法,就变成类下面的样子 输出:
阅读全文