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

Kotlin ① ( 类 | 参数 | 型函数 | 多参数 | 类型约束 )

文章目录 一、类 二、参数 三、型函数 四、多参数 五、类型约束 一、类 ---- 定义一个 类 , 参数 T 放在 尖括号 中 , 该参数放在 类名后..., 主构造函数之前 , 该参数 T 是 类型占位符 , 在 该类类中 可以使用 类型占位符 T 作为一个类 使用 , 可以 定义 T 类型成员属性 主构造函数中可以接收 T 类型的实例对象作为参数..., T 类型可以 作为函数的返回值 ; 通常情况下 , 参数 都使用 T 表示 , 使用其它字母 或者 字符串 都可以表示 参数 , 但是 约定俗成 都使用 T 来表示 ; 代码示例 :...---- 通常情况下 , 参数 都使用 T 表示 , 使用其它字母 或者 字符串 都可以表示 参数 , 但是 约定俗成 都使用 T 来表示 ; 在下面的代码中 , 使用 M 作为 参数...R 的类型是 Boolean 类型 ; 3.14 true 五、类型约束 ---- 在 类 , 型函数 中 , 使用前 , 需要声明 参数 : 参数 声明 : 如果类中

2.7K10

Kotlin :类型参数约束

上一篇文章讲了 Kotlin :基本使用,接下来我们再进一步了解使用相关的进阶知识。本篇是 Kotlin 类型参数约束的讲解,更多内容可点击链接查看。...Kotlin :基本使用Kotlin :类型参数约束系列持续更新中,欢迎关注订阅。...一个类型指定为「类型形参」的「上界约束」,那么在使用具体类型作为「类型实参」时,这个具体的类型必须是这个上界约束的类型或者它的子类型。...「上界约束」是这样定义的:在类型参数名称之后,添加冒号和作为类型形参的类型。没有指定类型上界时,是这么定义的:,Number指定为上界类型后,是这样的:。...max函数但因为Any类没有实现Comparable,尝试作为参数传入max函数,编译器识别出来,中止代码的编译。

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

Kotlin总结 ★ ( 类 | 参数 | 型函数 | 多参数 | 类型约束 | 可变参数结合 | out 协变 | in 逆变 | reified 检查参数类型 )

九、 in 逆变 十、 invariant 不变 十一、逆变协变代码示例 十二、使用 reified 关键字检查参数类型 一、类 ---- 定义一个 类 , 参数 T...主构造函数中可以接收 T 类型的实例对象作为参数 , T 类型可以 作为函数的返回值 ; 通常情况下 , 参数 都使用 T 表示 , 使用其它字母 或者 字符串 都可以表示 参数 , 但是 约定俗成...子类对象 ; 在 类 中 , 如果只将 类型 作为 函数的参数 类型 , 则在 声明 参数 类型 时 , 在 参数 前 使用 in 关键字 , 同时 该 类 又称为 消费类...(t: T) } 十、 invariant 不变 ---- 在 类 中 , 如果 既 类型 作为 函数的参数 类型 , 又将 类型 作为 函数的返回值 类型 , 则在 声明 参数...在 Java 中 , 运行时 不知道 参数 的 具体类型 ; 在 Kotlin 中可以 通过 reified 关键字检查 参数类型 ; Java 中如果想要知道 参数 具体类型 , 通过常规的方法无法实现

3.8K10

Kotlin ③ ( out 协变 | in 逆变 | invariant 不变 | 逆变协变代码示例 | 使用 reified 关键字检查参数类型 )

作为 函数的返回值 类型 , 则在 声明 参数 类型 时 , 在 参数 前 使用 out 关键字 , 同时 该 类 又称为 生产类 ( 生产接口 ) , 用于生产 类 指定的对象...- 使用 in 关键字 , 可以使 父类对象 赋值给 子类对象 ; 在 类 中 , 如果只将 类型 作为 函数的参数 类型 , 则在 声明 参数 类型 时 , 在 参数 前...Consumer { fun consume(t: T) } 三、 invariant 不变 ---- 在 类 中 , 如果 既 类型 作为 函数的参数 类型 , 又将...类型 作为 函数的返回值 类型 , 则在 声明 参数 类型 时 , 既不使用 in 关键字 , 又不使用 out 关键字 ; 代码示例 : 在下面的接口中 , 类型 即用于作为 返回值 ,...在 Java 中 , 运行时 不知道 参数 的 具体类型 ; 在 Kotlin 中可以 通过 reified 关键字检查 参数类型 ; Java 中如果想要知道 参数 具体类型 , 通过常规的方法无法实现

1.6K10

Kotlin ② ( 可变参数 vararg 关键字与结合使用 | 使用 [] 运算符获取指定可变参数对象 )

文章目录 一、可变参数 vararg 关键字与结合使用 二、使用 [] 运算符获取指定可变参数对象 一、可变参数 vararg 关键字与结合使用 ---- 如果 类型 T 的参数 是 vararg...可变参数 , 则在接收 可变参数 时 , 需要使用 Array 类型 的变量进行接收 ; 参数为 vararg 可变参数 , 那么可以传入多个 指定类型的 实例对象 ; 在下面的代码中..., 声明了 参数 T , T 类型不必须是 Weapon 类的子类类型 ; 在 Soldier 的主构造函数中 , 传入了 T 类型的 可变参数 对象 ; 如果要使用 成员属性 接收该 ...T 类型的 可变参数 对象 , 则必须 使用 Array 类型对象进行接收 ; 代码示例 : class Soldier(vararg _items: T) {...二、使用 [] 运算符获取指定可变参数对象 ---- 如果想要 使用 [] 运算符获取指定可变参数对象 , 就需要 重写 该类 的 get 函数 进行 运算符重载 ; 如果想要通过 Soldier 实例对象

65320

T::class 和 this::class 的区别

引子 前几天推送了一篇文章:你绝对想不到 Kotlin 给反射留下了怎样的坑!,受到一位朋友的评论的启发,这篇文章就承接前文,探讨一下 T::class 和 this::class 区别。...参数的例子 其实问题是很清楚的,this::class 表示的是对象的类型,而 T::class 则取决于 T 被如何推断。具体用哪个,取决于你的需求。...我们知道 Kotlin也是伪,T 在这里不能直接用于获取其具体的类型,如果我们想要初始化 t,该怎么做呢?....arguments.first() // T 的实参 .type!!....也正是因为这一点,我们想要获取参数 T 的实参,还需要先拿到 super type 也就是 A 的 KType 实例了。 其次,获取实参,并拿到实参类型的 KClass 实例。

1.2K30

【C++】编程 ⑦ ( 类模板常用用法 | 类模板声明 | 类模板调用 | 类模板作为函数参数 )

; MyClass 此时 , 注明 类型后 , 就会生成 具体的类 ; 然后 , 使用 具体的类 , 定义 具体的 变量 ; MyClass myInt(10); 3、类模板做函数参数...类模板 作为函数参数 , 形参 必须是具体类型 , 也就是 类模板 的类型必须声注明 ; 下面的 fun 函数中 , 接收模板类作为参数 , 模板类的 类型 需要被注明 ; // 类模板对象作为函数参数...// 形参必须是具体类型 // 类模板的类型必须声注明 void fun(MyClass &a) { a.printValue(); } 如果不指定 类型 , 会报错 error...:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(39,15): error C2664: “void fun(MyClass &)”: 无法参数...T , 并创建一个具有该类型的成员变量的对象 ; MyClass是一个模板类 , 该模板类 接受一个 类型参数T , 类型参数 T 在类中的许多地方都会用到 , 在类体中定义了一个 T 类型的成员变量

5000

【C++】编程 ⑦ ( 模板类常用用法 | 模板类声明 | 模板类调用 | 模板类作为函数参数 )

; MyClass 此时 , 注明 类型后 , 就会生成 具体的类 ; 然后 , 使用 具体的类 , 定义 具体的 变量 ; MyClass myInt(10); 3、类模板做函数参数...类模板 作为函数参数 , 形参 必须是具体类型 , 也就是 类模板 的类型必须声注明 ; 下面的 fun 函数中 , 接收模板类作为参数 , 模板类的 类型 需要被注明 ; // 类模板对象作为函数参数...// 形参必须是具体类型 // 类模板的类型必须声注明 void fun(MyClass &a) { a.printValue(); } 如果不指定 类型 , 会报错 error...:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(39,15): error C2664: “void fun(MyClass &)”: 无法参数...T , 并创建一个具有该类型的成员变量的对象 ; MyClass是一个模板类 , 该模板类 接受一个 类型参数T , 类型参数 T 在类中的许多地方都会用到 , 在类体中定义了一个 T 类型的成员变量

28540

一文了解 JavaKotlin 中的

,比如 List 中的 String 就是类型参数,和普通参数不同,类型参数传递的是一个类型而不是对象为了描述方便,以下把所有「类型参数为子类的」简称为「子类」,「类型参数为父类的...」简称为「父类」对于从 Java 转到 Kotlin 的开发者们来说,要了解,最好先搞懂 Java 中的,再来看 Kotlin时会变得易如反掌。...有时候我们希望把子类对象作为实参传递给一个声明为父类的形参,例如:public int getAnimalsCount(List animals) { return animals.size...extends Animal 表示此方法可以接受 Animal 或者 Animal 子类的集合,这就使得类型协变了逆变同理,有时候我们希望把父类对象作为实参传递给子类的形参,例如// 用于监听小动物是否饿了的监听器...T> {}// 在声明的时候没有指定型变,此时该类型的不变的interface SourceB {}// 使用处变: 在使用 SourceB 作为参数的时候,我们指定了类型参数为 out

89020

一文了解 JavaKotlin 中的

,比如 List 中的 String 就是类型参数,和普通参数不同,类型参数传递的是一个类型而不是对象为了描述方便,以下把所有「类型参数为子类的」简称为「子类」,「类型参数为父类的...」简称为「父类」对于从 Java 转到 Kotlin 的开发者们来说,要了解,最好先搞懂 Java 中的,再来看 Kotlin时会变得易如反掌。...有时候我们希望把子类对象作为实参传递给一个声明为父类的形参,例如:public int getAnimalsCount(List animals) { return animals.size...extends Animal 表示此方法可以接受 Animal 或者 Animal 子类的集合,这就使得类型协变了逆变同理,有时候我们希望把父类对象作为实参传递给子类的形参,例如// 用于监听小动物是否饿了的监听器...T> {}// 在声明的时候没有指定型变,此时该类型的不变的interface SourceB {}// 使用处变: 在使用 SourceB 作为参数的时候,我们指定了类型参数为 out

1.1K52

Kotlin :基本使用

Kotlin :基本使用Kotlin :类型参数约束系列持续更新中,欢迎关注订阅。为什么需要假如我们想实现自定义的列表类型,用于存放数值、字符串或其他具体的类型。...什么是提供了一种方法,允许我们定义带「类型参数」的类/型函数,在创建类的实例、调用型函数时,「类型参数替换成具体的「类型实参」。...// 编译出错,类型不匹配机制允许我们在编码的时候,使用占位符作为类型(即「类型参数」代替实际使用时的类型(即「类型实参」)。如何区别上述两个概念?...// Always true了解到这里,就掌握了基本的使用方式:用「类型参数作为占位符,定义类、型函数使用类、型函数时,需要传递具体类型作为「类型实参」。...下一篇文章,介绍 Kotlin 的进阶知识:类型参数约束

1.7K30

Kotlin入门潜修之类和对象篇—及其原理

而假如我们在创建类型的时候也为其指定参数,这个参数又是个类型,那么我们就称之为。 那么的作用和意义是什么?使用能够像传递参数一样传递类型,同时保证运行时的类型安全。...> list) { //在该方法中测试添加对象,实际上测试的是无界通配符作为参数的场景,因为list的类型是List即List list) { //在该方法中测试添加对象,list.add实际上测试的是通配符作为参数的场景,因为list的类型是List类即List list) { //在该方法中测试添加对象,list.add实际上测试的是通配符作为参数的场景,因为list的类型是List类即List<?...in修饰符允许我们写 } 这种情况叫做逆变,即我们当类型参数具有继承关系的时候,我们可以认为整个也有继承关系,而使用in修饰后,可以允许父类型变量赋值于子类型变量,如上面代码中,Comparable

90430

Kotlin变之路

❝正是由于擦除的问题,你甚至可以通过反射绕开的限制,传递一个非当前限制的对象。...但是这种处理在我们处理业务时,会有很多限制,所以,提供了「变」来拓展的使用。 协变 协变指的是,当参数具有父子关系时,子类可以作为参数传递,而的上界就是其父类。...所以,经过协变之后的,就失去了写入的能力,它只能用于向外提供数据,也就是「数据生产者Producer」。 逆变 逆变指的是,父类可以作为参数传递,但子类必须是其下界。逆变通过下界通配符<?...通常来说,参数协变后则表示——「这个参数在当前类中,只能作为函数的返回值,或者是只读属性」。...} 而逆变,表示这个参数「只能作为函数的参数,或者修饰可变属性」。

1.2K21

Kotlin的互操作——Kotlin与Java互相调用

当把平台值传递给期待非空值等的Kotlin函数时,也会触发一个断言。总的来说,编译器尽力阻止空值通过程序向远传播(由于的原因,有时这不可能完全消除)。...与Java一样,Kotlin在运行时不保留,也就是对象不携带传递到它们的构造器中的类型参数的实际类型,即ArrayList()和ArrayList()是不能区分的...这使得执行is检查不可能照顾到Kotlin只允许is检查星投影的类型。...⑦ 变的Kotlin使用了声明处变时,可以通过两种方式从Java代码中看到它们的用法。...因此,示例中的对应函数实际上翻译如下: // 作为返回类型——没有通配符 Box boxDerived(Derived value) { … } // 作为参数——有通配符 Base

3.7K10

Kotlin Vocabulary | Reified: 类型擦除后再生计划

解决这一问题的一个方法,是实际代表的类型信息作为一个参数传递给函数。...若是要在参数中使用 reified,那首先需要将函数标记为 inline,然后在参数之前添加 reified 关键字即可。...从反编译后的代码中可以发现,当调用 reified 修饰的内联函数时,编译器会复制该函数体,并将类型替换为实际使用的类型。这样,您就可以不用传递给函数也能够获取到相应类型信息了。...Java 不支持内联,也就意味着在 Java 中的参数不能逃脱被编译器擦除类型的命运。...使用内联函数,编译器可以在复制函数体时,同样返回类型替换为实际所表示的类型。

1.2K10

kotlin的reified

运行时没有类型信息,进一步导致像是jackson之类的库在做convertValue之类的操作时,方法虽然是个方法,但是还得带上一个Class的参数才能做转换。...> toValueTypeRef) 少了个参数简直爽爆了 实现 那这具体是怎么实现的呢? 我们知道Java的只是编译时做的参数检查,运行时并没有保留任何信息,任何类/方法也是普通的类/方法。...kotlin也是基于Jvm平台的,那kotlin中是如何实现参数传递的呢。我们可以通过反编译字节码一窥究竟。...限制 其实即便kotlin用inline实现了代码运行时携带信息,也没有达到C++模板展开的层次。...总结起来就是一句话,inline reified方法的参数必须就地使用,不能传递给别的inline reified方法。

1.4K10
领券