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

kotlin:不允许在类型别名类型参数上使用边界

Kotlin是一种现代化的静态类型编程语言,它运行在Java虚拟机上并且可以与Java代码无缝互操作。在Kotlin中,类型别名(type alias)是一种用于给现有类型起别名的机制,它可以提高代码的可读性和可维护性。

然而,Kotlin不允许在类型别名的类型参数上使用边界。边界(bounds)是指在泛型中限制类型参数的上界或下界。在Java中,我们可以使用extends关键字指定上界或使用super关键字指定下界。但是在Kotlin中,类型别名的类型参数不能使用这些边界限制。

这样的设计决策是为了保持Kotlin的简洁性和一致性。Kotlin鼓励使用接口和类继承来实现类型的约束,而不是在类型别名上使用边界。通过这种方式,代码的可读性和可维护性更高,并且可以更好地利用Kotlin语言的特性。

对于需要在类型别名上使用边界的情况,可以考虑使用泛型类或接口来替代类型别名。这样可以在类型参数上使用边界,并且可以更好地表达代码的意图。

总结起来,Kotlin不允许在类型别名类型参数上使用边界,这是为了保持语言的简洁性和一致性。在需要使用边界的情况下,可以考虑使用泛型类或接口来替代类型别名。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

深入理解Kotlin的泛型系统

Kotlin 中,针对于这两种情况给了另外两个关键字:需要读取带泛型对象的值时,使用 out 来标记类型参数;需要传入类型参数的类型作为形时,使用 in。...从方法参数的使用上来说,Kotlin 和 Java 似乎没有什么不同,而不同的地方在于 Kotlin 可以将这种定义作用在类型定义上,官方称之为声明点变型;与之相对应的,像 Java 这种方法参数上定义的被称为使用点变型...声明点变型类型的声明时定义了该类型参数是用在入还是出参上,之后在这个类中所有用到的地方都会直接调用该类型的定义名称来使用类型的协变或者逆变。...「*」投影 因为 Kotlin 源码中不允许忽略泛型参数,所以一些泛型不重要的地方,就不可避免的使用 来表示。...泛型的注意点: java编程中类型系统最棘手的一部分是通配符类型。但是,Kotlin编程中,是没有通配符,采用声明变化和类型投影来替代。 通配符的作用: 使用界限通配符增加API的灵活性。

1.1K10

Kotlin | 9. 泛型

{ return null } /* * 第一个 :类型声明 * 第二个 :接收者 类型使用类型...,同时另一个类型数上逆变。...可以声明一个类某个类型数上是协变的,如果该参数只是用在 out 位置。 逆变的情况正好相反:可以声明一个类某个类型数上是逆变的,如果该参数只是用在 in 位置。...函数接口声明成了第一个类型数上逆变而在第二个类型数上协变,使(Animal) -> Int 成为( Cat )一> Number 的子类型。...Kotlin 中既可以为整个泛型类指定变型(声明点变型),也可以为泛型类型特定的使用指定变型(使用点变型)。 当确切的类型实参是未知的或者不重要的时候,可以使用星号投影语法。

1.8K10

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

而假如我们创建类型的时候也为其指定参数,这个参数又是个类型,那么我们就称之为泛型。 那么泛型的作用和意义是什么?使用泛型能够像传递参数一样传递类型,同时保证运行时的类型安全。...} 上面test方法中的写法java中显然是不允许的,如果要允许我们就必须使用通配符写法: void test(IList strs) { IList<?...} 上面就是kotlin声明处变量的使用,解决了java没有消费场景的时候无法赋值的问题。...这里想要进行写操作,kotlin不允许的!!! } 那么如何解决呢?...kotlin中,默认的超类类型上限是Any?,定义超类型的时候,只能指定一个超类,比如中只能指定T的超类上限是SupperT,而不能指定多个。

89730

Kotlin入门(13)类成员的众生相

1、属性字段跟构造函数的入,不但名称一样,并且变量类型也是一样的; 2、初始化函数中给属性字段赋值,为了区别同名的属性与入,特意给属性字段添加了前缀“this.”; 你一拍脑袋,嘀咕道:说的也是。...如果某个字段并非入的同名属性,则需类内部显示声明该属性字段。...例如,前面WildAnimal类的性别只是个整型的类型字段,而界面上展示的是性别的中文名称,所以应当给该类补充一个性别名称的属性声明,这样每次访问sexName字段即可获得动物的展示性别。...利用伴生对象的技术,即可间接实现静态成员的功能,前面有个代码从性别类型获得性别名称,反过来也可以从性别名称获得性别类型,这个功能便可以伴生对象中定义一个judgeSex方法判断性别类型。...总结一下,Kotlin的类成员分为实例成员与静态成员两种,实例成员包括普通成员属性和成员方法,其中与入同名的成员属性可以构造函数中直接声明,外部必须通过类的实例才能调用实例成员。

55920

第11章 运算符重载与约定第11章 运算符重载与约定

第11章 运算符重载与约定 我们《第2章 Kotlin 语法基础》中已经学习过关于运算符的相关内容,本章将继续深入探讨Kotlin中的运算符的重载与约定。...而 Kotlin 允许我们为自己的类型实现一套自己的操作符运算逻辑的实现(重载函数)。这些操作符Kotlin中是约定好的固定的符号 (如:加法 + 、乘法 *)和固定的优先级。...System.out.println(b4); System.out.println(b5); System.out.println(b6); } 而在对象类型上是不允许使用这些比较运算符进行比较的...Java对象类型不允许使用比较运算符进行比较 而实际上,只要给定一个比较标准,原则上对象之间也是可以比较大小的,而不是仅仅限于基本数据类型。因为Kotlin中一切类型都是引用类型。...为了代码简单易懂,实现运算符重载函数的时候一定要考虑其实际问题场景的意义,并且在运算符重载函数上写清楚对象之间的比较规则,注释写清楚。否则,如果滥用运算符重载,会导致代码易读性大大下降。

92040

Kotlin学习日志(五)类与对象

已经类名后面指明了固定数量的入,又该如何表示拥有其他参数的构造函数呢?...呢,代码冗余了, (1)属性字段跟构造函数的入,二者名称一样,变量类型也一样。...Kotlin的代码真的精简了很多,鸟枪换炮, 如果某个字段并非入的同名属性,就需要在类内部显示声明该属性字段,例如,前面WildAnimal类的性别只是一个整型的类型字段,而界面上展示的是性别的中文名称...我们之前通过性别类型来获得性别名称,那么反推呢,我们使用伴生对象来实现这一功能,新创建一个名为WildAnimalCompanion的类 package com.llw.kotlinstart.custom_class...,而Kotlin的嵌套类不允许访问外部类的成员,强行访问则会报错。

1K20

Kotlin 1.4 新特性预览

不过,大家使用 Kotlin 开发时,一定会发现有些情况下明明类型是很确定的,编译器却一定要让我们显式的声明出来,这其实就是类型推导算法没有覆盖到的场景了。...Kotlin 支持了具名参数,那么入时二者混合使用会怎样呢? ?...图 5:1.3 当中不允许具名参数之后添加位置参数 1.3 当中,第三个参数会提示错误,理由就是位置参数前面已经有了具名参数了,这是禁止的。...这样主要的目的也是希望开发者能够避免写出混乱的入例子,不过这个例子似乎并不会有什么令人疑惑的地方,于是 1.4 我们可以具名参数后面跟位置参数啦。 其实这个特性并不会对入有很大的影响。...补充一点,本文撰写过程中,我使用 IntelliJ IDEA 2019.3.3 来运行 Kotlin 1.3,使用 IntelliJ IDEA 2020.1 BETA 来运行 Kotlin 1.4-M1

94110

Kotlin学习之路(4)函数的运用

通过两者的对比,咱们可以发现 ① Java使用@Override表示该函数重载父类的方法,而Kotlin使用小写的override 同一行表达重载操作 ② Java 使用 protected /...Kotlin 中引用了空安全机制,允许某个变量为空,就需要在变量类型后面加个“?”...即可 内联函数 前面我们定义的泛型函数appendString时,是把它作为一个全局函数,也就是类外定义,而不是类内部定义。...因为类的成员依赖于类,只有泛型类才能拥有成员泛型函数,而普通类是不允许定义泛型函数的,否则编译器直接报错。...如果要让该方法同事接收整型和双精度的数组入,那就得使用泛型T 来自于基类Number 将改为,同时fun前面加上关键字inline,表示该函数属于内联函数

72710

5. 函数声明与闭包(Closure)

闭包概念介绍 闭包我第一次接触是 JavaScript 上,函数当作“一等公民”的编程语言都有这个概念。函数是“一等公民”的意思是,函数和变量一样,它是某种类型的实例,可以被赋值,可以被引用。...变量类型是某个声明的类,函数类型就是规定了入个数,类型和返回值类型(不规定名字。函数名就和变量名一样,随便起)。...如我要声明 Kotlin 一个函数类型,它的入是两个整数,出是一个整数,那应该这样写:val add: (Int, Int) -> Int。箭头左边括号内表示入,括号不可省略。...所以 Java 编译器不允许匿名类引用非 final 变量。 Java8 lambda 是进一步接近闭包的特性,lambda 的 JVM 实现是类似函数指针的东西。...Kotlin 正是通过这种办法使得局部变量可修改。除了 IntRef,还有 LongRef,FloatRef 等,如果是非基础类型,就统一用 ObjectRef 即可。

1.1K20

重学 Kotlin —— typealias,换了个马甲,我就不认识你了?

它的作用十分简单,给已有类型取一个别名,可以像使用类型一样使用这个 “类型别名” 。...举个简单的例子: typealias Name = String val name : Name = "java" println(name.length) 给 String 取个别名 Name ,使用过程中...诸如 typealias Red = Color.RED 是不允许的。 几乎没有 typealias 不适用的类型。说到现在,你又得疑问了,类型别名存在的意义是什么 ?...经过编译之后,类型别名会被原类型直接替换。这仅仅只是 Kotlin 丰富的语法糖之一,编译器在其中做了一些手脚。 typealias 存在的意义是什么 ? 现在,你估计更加困惑了。...类型别名和原类型的可见性必须保持一致。 导入同名类的处理 对于同一个类中导入两个同名类,通常的做法是, import 其中一个类,另一个使用全限定名。

54630

Kotlin极简教程》第五章 Kotlin面向对象编程(OOP)一个OOP版本的HelloWorld构造函数传Data Class定义接口&实现之写pojo bean定一个Rectangle对象封

这使得更易于使用kotlin与通过参数构造函数创建类的实例,如使用Jackson或JPA库的时候。...不能有“new”关键字 类成员 类可以包括 构造和初始化模块 函数 属性 匿名和内部类 对象声明 继承 Kotlin所有的类中都有一个共同的父类Any,这是一个默认的父类且没有父类型声明: class...如果父类的这个函数没有标注open,则子类中不允许定义同名函数,不论加不加override。 一个final类中(即没有声明open的类),函数上不允许加open标注。...为了表示从中继承的实现而采取的父类型,我们使用super{:.keyword}尖括号,如规范的父名super: open class A { open fun f() { print(...大多数情况下,它建议简单地使用包级函数。

1.5K40

使用 Kotlin 实现 Y 组合子(Y-Combinator)使用 Kotlin 实现 Y 组合子(Y-Combinator)《Kotlin极简教程》正式上架:

使用 Kotlin 实现 Y 组合子(Y-Combinator) 非常感谢您亲爱的读者,大家请多支持!!!...有任何问题,欢迎随时与我交流~ ---- 我们可以使用 Kotlin FP (Lambda, function) 写一个 Y-combinator 函数吗? Y = λf....] coffee> fact = Y (f) ->(n) -> if n==0 then 1 else n*f(n-1) [Function] coffee> fact(10) 3628800 动态类型语言中...(f(x x))) * * FP YCombinator */ // 为了方便易懂,使用 X 用做函数 (X)->Int 的别名 typealias X = (Int) -> Int // G...> X , block函数的入又是 G 类型,通过 invoke 函数来实现 调用自身: fun G(block: (G) -> X) = object : G { // 调用函数自身 `block

70120

kotlin入门之泛型

【码上开学】Kotlin 的泛型 在学习kotlin 泛型之前我们先来回顾一下关于Java的泛型基础吧。 说道泛型,我们可能最常用的就是在三大集合中去使用。...泛型 将具体的类型泛化,编码的时候用符号来值代类型使用时再确定他的类型。 因为泛型的存在,我们可以省去强制类型转化。 泛型是跟类型相关的,那么是不是也能使用类型的多态呢?...Java的泛型类型会在编译时发生类型擦除,为了保证类型安全,不允许这样赋值、 至于什么是类型擦除,等下再讲。 实际使用中,我们的确会用这种类似的需求,需要实现上面这种赋值。...说完了Java的泛型之后,我们回头看一下kotlin中的泛型。 kotlin 中的out和in kotlin和java泛型一样,kotlin中的泛型本身也是不可变的。...所以该方法的参数是传入不了的 *规则 如果使用在out修饰的类的泛型中使用,那么就会取其上限 如果使用在in修饰的类的泛型中使用,那么就会取其下限Nothing *使用范围 *不能直接或者间接应用在属性或者函数上

1.1K20

干货|Kotlin入门第一课:从对比Java开始

String) 上面类的定义声明属性时,Kotlin采用默认访问修饰符public,而Java是private,如果kotlin也是private,那同样得定义一系列的set()/get(),不然类外面无法通过对象获取属性...如果Kotlin定义类时有参数列表,那么新建对象时必须传入形值,不像Java有两种方式(1 先建一个无对象,再通过set()来给属性赋值;2 直接通过参数列表创建对象)。...Kotlin提供了一种安全机制,尽量减少变量使用前是null的情况。 Java: 1 String str; 2 if (str !...表示不允许为null; 第2行,编译通过,作第一行代码的另一种情况,加了问号,并赋值为null; 第3行,编译通过,隐式赋值为”testNull”,Kotlin会自动推断出str3类型为String,之后便不可再更改了...有两种形式定义的变量不用担心(1 类型为String且不允许为null;2 类中不包含length属性), 理由很简单,前者不会出现null异常,后者获取length属性在编译阶段就会出错,或者说敲完代码时编译器就会标红提示了

978110

Kotlin入门(14)继承的那些事儿

,所以它不允许被继承。...比方说性别名称“公”和“母”一般用于家禽,像公鸡、母鸡、公鸭、母鸭等等,指代野生鸟类的性别则通常使用“雄”和“雌”,所以定义野生鸟类的时候,就得重写获取性别名称的getSexName方法,把“公”和“母...Kotlin的接口与Java一样是为了间接实现多重继承,由于直接继承多个类可能存在方法冲突等问题,因此Kotlin在编译阶段就不允许某个类同时继承多个基类,否则会报错“Only one class may...,所以这些方法默认为抽象类型; 3、与Java不同的是,Kotlin允许接口内部实现某个方法,而Java接口的所有内部方法都必须是抽象方法; Android开发最常见的接口是控件的点击监听器View.OnClickListener...因此针对鸟类的飞翔、游泳、奔跑等动作,即可声明Behavior接口,该接口中定义几个行为方法如fly、swim、run,下面是一个定义好的行为接口代码例子: //Kotlin与Java一样不允许多重继承

1.5K50

第12章 元编程与注解、反射第12章 元编程与注解、反射

使用注解之前(甚至使用之后),XML配置文件被广泛的应用于编程过程中的元数据的描述。...12.2 注解 Kotlin的注解跟Java注解也完全兼容。我们可以Kotlin代码中很自然地使用Java中的注解。...) 或enum声明的 TYPE, 表达式 EXPRESSION,文件 FILE,类型别名TYPEALIAS等。...Kotlin中的函数和属性也是头等公民,我们可以通过反射来内省属性和函数:如运行时属性名或类型,函数名或类型等。 Kotlin中我们有两种方式来实现反射的功能。...另外,我们所说的 Java 泛型字节码中会被擦除,并不总是擦除为 Object 类型,而是擦除到上限类型Kotlin也是一样的泛型机制。

97720

第5章 函数与函数式编程第5章 函数与函数式编程

函数式编程中,倾向于使用纯函数编程。正因为纯函数不会去修改数据,同时又使用不可变数据,所以程序不会去修改一个已经存在的数据结构,而是根据一定的映射逻辑创建一份新的数据。...Kotlin 声明函数 为了更加直观的感受到函数也可以当做变量来使用,我们声明一个函数类型的变量 sum 如下 >>> val sum = fun(x:Int, y:Int):Int { return...Kotlin中有简单好用的 Kotlin 类型别名, 我们使用 G,F,H 来声明3个函数类型 typealias G = (String) -> Int typealias F = (Int) ->...如果没有 { } , 那么返回值就是一个布尔类型Boolean了。 通过上面的代码例子,我们可以看到,Kotlin中,我们可以简单优雅的实现高阶函数。...Kotlin中进行函数式编程相当简单自如。

43910

Android Kotlin:这是一份全面 & 详细的类使用语法学习指南

类的声明 & 实例化 // 格式 class 类名(参数名1:参数类型,参数名2:参数类型...){ // to do } // 示例 class User(userName...: String, age: Int){ // to do } // 实例化 // Kotlin没有new关键字,所以直接创建类的实例(无情况 & 有): var...user = User() var user = User("ABC" , 123) // 额外说明:Kotlin支持默认参数 // 即在调用函数时可不指定参数,则使用默认函数 class User(...继承 & 重写 类似于Java,Kotlin是单继承 = 只有一个父类 区别:Kotlin使用冒号“ : ”继承 & 默认不允许继承(若想让类可被继承,需用open关键字来标识) // 用open关键字标识该类允许被继承...open class Food // 类Fruits继承类Food class Fruits : Food() 对于子类重写父类的方法,Kotlin中,方法也是默认不可重写的 若子类要重写父类中的方法

74240

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

Kotlin 基础语法 5.1 kotlin 方法 5.1.1 kotlin 方法声明 Kotlin 定义方式比较简单,括号中是参数,格式: "函数名(参数名称: 参数): 返回类型",返回类型定义括号外...5.1.3 kotlin 方法自动传 Kotlin 可以 构造方法或者相关函数大括号里面设置默认参数,这样传就可以使用默认参数了,我们具体看看怎么使用的吧~ ?...如果需要声明一个变量可为空,仅需变量类型后面加上? val n: String?=null 声明一个变量可为空,仅需变量类型后面加上?...// 使用n的时候,由于n可能为null,直接使用编译器会报错 n.length // 正确的使用方式是,使用前,做判空处理 // 如果变量为空,只需变量类型后面加上?...Kotlin 可以使用安全转换操作符 as?,它可以失败时返回 null,详细代码如下: foo as?

1.6K30

Kotlin 泛型:类型参数约束

上一篇文章讲了 Kotlin 泛型:基本使用,接下来我们再进一步了解泛型使用相关的进阶知识。本篇是 Kotlin 泛型类型参数约束的讲解,更多内容可点击链接查看。...Kotlin 泛型:基本使用Kotlin 泛型:类型参数约束系列持续更新中,欢迎关注订阅。...将一个类型指定为「类型」的「上界约束」,那么使用具体类型作为「类型实参」时,这个具体的类型必须是这个上界约束的类型或者它的子类型。...「上界约束」是这样定义的:类型参数名称之后,添加冒号和作为类型类型。没有指定类型上界时,是这么定义的:,将Number指定为上界类型后,是这样的:。...「多重约束」可以让一个类型数上指定多个约束,它使用where语法来表达:interface Printable { fun getContent(): ByteBuffer}class Printer

2.1K31
领券