首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin热身篇: 简介与基本用法

Kotlin 基础语法 5.1 kotlin 方法 5.1.1 kotlin 方法声明 Kotlin 定义方式比较简单,括号中是参数,格式: "函数名(参数名称: 参数): 返回类型",返回类型定义在括号外...5.1.3 kotlin 方法自动传参 Kotlin 可以在 构造方法或者相关函数大括号里面设置默认参数,这样传参就可以使用默认参数了,我们具体看看怎么使用吧~ ?...const 相当于 java 里面的 final,表示一旦初始便立即被主内存看到,不能被二次赋值 当然 kotlin 也有自动拆箱和装箱 Int 翻译成 Java int 或 Integer...null 判断 以上声明变量皆为非空变量,即不允许为空值。...6.2.2 kotlin data Kotlin 里面声明一个 data 需要满足以下条件: data 必须要有一个构造方法,且包含至少一个参数 该 data 构造参数强制使用 val 或

1.6K30

Kotlin 泛型详解

真·泛型和伪·泛型 Java 泛型大家肯定都知道了,1.5 之后才加入,可以为方法分别定义泛型参数,就像下面这样: public class Generics{    private T...对于协变类型,通常我们是不允许泛型类型作为传入参数类型,或者说,对于协变类型,我们通常是不允许其涉及泛型参数部分被改变。...逆变情形正好相反,即不可以泛型参数作为方法返回值。...= List::class.java Kotlin 可以根据 * 所指代泛型参数进行相应映射,下面是官方说法: 对于 Foo ,其中 T 是一个具有上界 TUpper 协变类型参数...* 不允许作为函数和变量类型泛型参数! interface Foo class Bar : Foo // ERROR! * 不能直接作为泛型参数传入!

1.1K20
您找到你想要的搜索结果了吗?
是的
没有找到

深入理解Kotlin泛型系统

泛型(Generics)其实就是把类型参数,真正名字叫做 类型参数,它类型编程语言加入了更强灵活性。...在 Java 中,只要是有类型 API 元素,都可以泛型,也就是泛型、泛型接口、泛型方法和泛型属性,泛型和泛型接口可以统称为泛型类型。...val clazz = T::class.java } 泛型协变、逆变 在 Java 中,定义带泛型参数时为了更好匹配目标类型,有 ?...而 Kotlin 中,针对于这两种情况了另外两个关键字:需要读取带泛型对象值时,使用 out 来标记类型参数;需要传入类型参数类型作为形参时,使用 in。...从方法参数使用上来说,KotlinJava 似乎没有什么不同,而不同地方在于 Kotlin 可以这种定义作用在类型定义上,官方称之为声明点变型;与之相对应,像 Java 这种在方法参数上定义被称为使用点变型

1.1K10

你应该知道kotlin实用技巧

(如Gson)中,当您想要反序列该JSON字符串时,您最终必须将Class对象作为参数传递,以便Gson知道您想要类型。...val user: User = Gson().fromJson(json) Kotlin根据它用法推断出类型 - 因为我们将它分配给User类型变量,Kotlin使用它作为fromJson()类型参数...使用fun关键字标记接口后,只要将此类接口作为参数,就可以lambda作为参数传递。...2.观察回调方法参数,提取成一个函数类型(function type),并且按照需要使用类型别名函数类型起一个别称,并且用私有修饰。...4.在中定义一些跟回调接口一样名字,但是参数是对应函数类型函数,并且函数类型赋值当前对应成员变量。

1.5K10

你应该知道kotlin实用技巧

Gson)中,当您想要反序列该JSON字符串时,您最终必须将Class对象作为参数传递,以便Gson知道您想要类型。...val user: User = Gson().fromJson(json) Kotlin根据它用法推断出类型 - 因为我们将它分配给User类型变量,Kotlin使用它作为fromJson()类型参数...使用fun关键字标记接口后,只要将此类接口作为参数,就可以lambda作为参数传递。...2.观察回调方法参数,提取成一个函数类型(function type),并且按照需要使用类型别名函数类型起一个别称,并且用私有修饰。...4.在中定义一些跟回调接口一样名字,但是参数是对应函数类型函数,并且函数类型赋值当前对应成员变量。

1.4K00

Kotlin入门教程,快使用Kotlin

KotlinChar类型不能作为数字使用,如果需要的话需要使用toInt方法转换。...) 常量与变量都可以没有初始值,但是在引用前必须初始 4、NULL检查机制 又名Kotlin空安全,这是Kotlin独有的,在对于声明可空参数,在使用时要进行判空处理,有两种处理方式,字段后面加上...T以及T,下限是T;在kotlin中可以使用in来代替例如clazz: Class 静态和静态方法 object(全局): 使用object修饰,同时会创建一个实例(类似Java...,而次构造函数参数不能; 主构造函数中可以直接申明并初始属性,而次构造函数不能直接申明属性; 如果申明了主构造函数,那么所有的次构造函数都必需直接或间接地委托主构造函数; 非抽象中如果没有声明任何构造函数...block(this) 8 return this 9} 1.3、with函数 with函数与其他函数不同,他不是一个扩展函数,它是某个对象作为函数参数,在函数块内可以通过 this 指代该对象

97610

kotlin入门之泛型

泛型 具体类型,编码时候用符号来值代类型,在使用时再确定他类型。 因为泛型存在,我们可以省去强制类型转化。 泛型是跟类型相关,那么是不是也能使用与类型多态呢?...Java泛型类型会在编译时发生类型擦除,为了保证类型安全,不允许这样赋值、 至于什么是类型擦除,等下再讲。 在实际使用中,我们的确会用这种类似的需求,需要实现上面这种赋值。... 存在协变点泛型参数必须声明为协变或者不变 当泛型作为泛型参数实例生产者时用协变 in //垃圾 open class Waste //干垃圾 class DryWaste :...>兼容Producer 存在逆变点泛型参数必须声明为协变或者不变 当泛型作为泛型参数实例消费者时用协变 *号 *号 前面讲到了 Java 中单个?...P2)=TODO() } val f:Function=Function() f.invoke()//参数为下限,但是我们kotlin中下限为`Nothing`,无法实例

1.1K20

Kotlin 基础 | 拒绝语法噪音

kotlin方法默认是final(可省略不写),这意味着默认情况下,方法不允许被继承和重写(这是为了防止脆弱,即对基方法修改会导致子类出现预期之外行为)。...如果函数体由单个表达式构成,可以省去花括号和return,并用赋值=表示表达式值赋值返回值,这种语法叫表达式函数体: //java public int add(int a, int b){...可以also源码和apply做对比,更好理解他们调用者角色差别: //为泛型T对象添加新功能also(),它接受一个lambda类型参数block,且对象是lambda参数 public inline...override保留字表示重写父方法或者实现接口中抽象方法,与 java 不同是,它必须显示出现在重写方法前( java 允许省略)。 as保留字用于类型强制转换。...置于类型之后表示这个类型变量或返回值值可能为null。 kotlin 使用扩展函数,可以在体外新增方法kotlin 预定了很多扩展函数,其中有一适用于“对同一个对象做多次操作”。

1.1K30

【Android】只个泛型,如何自动初始ViewModel与ViewBinding?这几种方案值得了解

但是对于一些类似ViewModel,ViewBindig之类对象初始,我们需要明确知道是哪一个类型才能初始怎么办?...但是我不想在具体页面去写这些手动调用: ViewModelProvider(owner).get(%T::class.java) %T.inflate(layoutInflater) 或者基抽象实现...,让基去自动帮我初始,能不能直接在基中: ViewModelProvider(this).get(VM::class.java) VB.inflate(inflater) 这样会报错,因为运行期间泛型会被擦除也无法实例对应对象...很容易就能找到为混淆: 类型安全与可读性 反射调用减少了编译时类型检查机会,增加了运行时错误风险。...:class.java)", ClassName(pack, viewModelName)) // 具体方法 .build() ) /

5010

Kotlin | 9. 泛型

* 每次调用带实类型参数函数时,编译器都知道这次特定调用中用作类型实参的确切类型。 * 因此,编译器可以生成引用作为类型实参具体字节码。...== Service.java 如何获取java.lang.Class对应Kotlin // 使用带实类型参数函数重写这个例子 val serviceImpl2...作为调用其他函数类型实参 * * 不能做下面的事情: * - 创建指定为类型参数实例 * - 调用类型参数伴生对象方法...* - 调调用带实类型参数函数时候使用非实类型形参作为类型实参 * - 把、属性或者非内联函数类型参数标记为reified */ 9.3...// 代码清单9.16 带 out 投影类型参数数据拷贝函数 // 可以类型用法加上 out 关键字:没有使用那些 T 用在 in 位置方法

1.8K10

JavaKotlin,再从 Kotlin 回归 Java

Kotlin方法参数是一个值,所以你不能改变 num 参数。这是好语言设计,因为你不应该改变方法参数。但是你可以用相同名称定义另一个变量,并按照你想要方式初始。...在 Java 中,我们习惯用方法参数来遮蔽字段。...它被称为平台类型,它意思是TT?,或者如果我们想要精确,T!意味着具有未定义空值T类型。这种奇怪类型不能用Kotlin来表示,它只能从Java类型推断出来。T!...为什么KotlinJavaT类型推断到T!而不是T?呢?似乎Java互操作性破坏了Kotlin杀手特性——类型推断。看起来您应该显式地声明类型(如T?)...在阅读一个方法声明时候,你最先想知道应该是方法名称和返回类型,然后才会去了解参数

1.5K10

泛型编程

Java泛型编程 在Java中有泛型和泛型方法之分,这些都是表现形式改变,实质还是算法尽可能地抽象,不依赖具体类型。...variance - 变化 和Java泛型中泛型方法和泛型概念类似,Kotlin将对应概念称为参数函数和参数类型。...fun random(one: T, two: T, three: T): T parameterized type 参数类型 除了参数函数,类型本身也可以定义自己参数类型。...方法出现了编译错误,原因就是在协变关系中,泛型参数只能作为输出参数,而不能作为输入参数。...但是我们也注意到ContravarianceBoxfirst方法出现了编译错误,原因就是在逆变关系中,泛型参数只能作为输入参数,而不能作为输出参数

79720

Kotlin 学习笔记(一)

正确做法是:func(Int::class.javaObjectType),而不是func(Int::class.java) 2)Int::class.java 指向kotlin 标准库中...扩展函数 kotlin 支持原有的添加一些扩展功能,就是通过扩展函数来实现。可以针对第三方库中对象添加一些我们需要方法。...,所以我们可以这个Function23 声明为一个 Java,并将它包名设置为kotlin,这样就可以声明参数个数超过 22 闭包了。...Kotlin 构造函数会默认调用 init 方法,所以可以在 init 方法中执行一些初始操作: class TestView: View { constructor(context:...访问Integer.class](https://www.javaroad.cn/questions/299414) [Kotlin 调用Java方法参数Class 神坑](https://

59610

【Jetpack】使用 Room 框架访问 Android 平台 SQLite 数据库 ( 导入依赖 | 定义 Entity 实体 | 定义 Dao 数据库访问对象接口 | 定义数据库实例 )

Entity 实体 定义完成后 , 就意味着 数据库表结构 已经定义完成 ; @Entity 注解 Entity 实体 需要使用 @Entity 注解进行修饰 , 该注解可以 传入 tableName...* 这个构造方法开发者使用 */ @Ignore constructor(name: String, age: Int) { this.name...) @Query 注解 查询数据库中数据 , 使用 @Query 注解修饰对应抽象方法 ; 注解中可以设置字符串参数 , 该字符串参数就是查询 SQL 语句 , 使用 冒号 : 可访问传入参数..., 数据库名称 等参数 ; 然后 , 调用 RoomDatabase.Builder 对象 build 函数 , 创建数据库 ; 注意 : Room 原则上不允许在主线程操作数据库 , 如果要在主线程操作数据库...* 这个构造方法开发者使用 */ @Ignore constructor(name: String, age: Int) { this.name

33930

Kotlin 程序设计》第三章 Kotlin 类型系统第三章 Kotlin 类型系统基本数据类型2.字符类型CharKotlin类型系统参考资料

所以,在KotlinJava互操作时,遇到Java基本类型时候,要小心点。这地方Kotlin编译器,会把Java基本类型自动装箱成对应封装。...意思是,泛型类型参数是不可变。例如Array与Array不是子父关系,故无法Array实例当做Array使用。这么做,是为了类型安全。...首先,Java中泛型参数类型是非协变(invariant),这意味着List并不是List类型。...extends T 表明这个方法接受 T类型对象集合,并非T本身。这意味着,可以从列表中安全读取T(集合中所有的元素都是T一个子类),但是我们无法写入因为我们并不知道哪些T子类。...super String> 是List。这被成为 逆变(contravariance)。 你只能使用String作为参数在List<?

1.3K30

Kotlin 极简教程 》第4章 基本数据类型类型系统

在20世纪五六十年代,这种分类扩展到了结构数据和高阶函数中。 70年代,引入了几个更为丰富概念,例如:参数类型,抽象数据类型,模块系统,子类型等等,类型系统作为一个独立领域形成了。...程序员理论和实践结合到一起: 既不好用,也不知道是为什么。 默认 | 用作边界前缀,但你可以选择其他字符并作为参数传入,比如 trimMargin(">")。...还提供了一个构造函数: public inline constructor(size: Int, init: (Int) -> T) 第1个参数是数组大小,第2个参数是一个初始函数类型参数(关于函数类型...Kotlin中,我们不能把 Array 赋值 Array。这地方Kotlin类型检查限制强于Java数组类型。...Kotlin类型系统和Java相比,首要区别就是Kotlin对可空类型显式支持。 在本节中,我们讨论Kotlin可空类型

2K20

号称取代 Java Kotlin 语言到底是什么鬼?

Kotlin 中, 方法参数无法修改,因此在本例中你不能改变 num。这个设计很好,因为你不应该改变方法输入参数。但是你可以用相同名称定义另一个变量并对其进行初始。...我从个人角度赞成 IDEA 做法因为我想不到有哪些应用场景需要遮蔽方法参数类型推断 在Kotlin中,当你声明一个var或是val,你通常会让编译器从右边表达式类型中猜测变量类型。...第二个问题,当你读取一个方法声明时,你首先看到是名字和返回类型,然后才是参数。...在 equals() 没有违反 Liskov 原则情况下,没有办法产生正确基于价值数据。 这也是为什么 Kotlin 不允许数据继承原因。 开放 Kotlin 默认为 final。...这就是为什么 Kotlin 不允许数据继承原因。 我不知道你为什么提出这个问题。如果你需要更复杂,你仍然可以创建它们并手动维护它们 equals、hashCode 等方法

2.2K50

有意思,发现Kotlin一个神奇bug!

}}", User::class.java) //2、反序列List对象,其它带有泛型,皆可用此方法序列 val type = object : TypeToken<List<User...}]", type) 以上写法,是Java语法翻译过来,它有一个缺点,那就是泛型传递必须要通过另一个去实现,上面我们借助TypeToken,相信这一点,很多人都不能接受,于是乎,在Kotlin...null } } 可以看到,我们在方法前加上了inline关键字,表明这是一个内联函数;接着在泛型T前面加上reified关键字,并把方法里不需要Type参数去掉;最后我们通过T::class.java...至于为什么依赖本module方法,遇到泛型T与具体相结合时,泛型T会被擦除问题,这个就需要Kotlin官网来解答了,有知道原因小伙伴,可以在评论区留言。...List 类型 val type: Type = ParameterizedTypeImpl[List::class.java, User::class.java] 详细用法可查看Android

90120
领券