| 类型 | 例子 | 能否当标识符 | 说明 |
|---|---|---|---|
| 硬关键字 Hard keywords | as break class continue do else false for fun if in !in interface is !is null object package return super this throw true try typealias typeof val var when while | ❌ 不能 | 任何位置都被解析为关键字,语法上无法用作标识符 |
| 软关键字 Soft keywords | by catch constructor delegate dynamic field file finally get import init param property receiver set setparam value where | ✅ 能 | 只在特定语法语境中才是关键字;出现在普通标识符位置(如变量名)时就是普通名字 |
| 修饰符关键字 Modifier keywords | abstract actual annotation companion const crossinline data enum expect external final infix inline inner internal lateinit noinline open operator out override private protected public reified sealed suspend tailrec vararg | ⚠️ 基本能 | 只有当它出现在修饰符位置(紧跟声明/类型)时才按修饰符解析;其他上下文可作标识符 |
软关键字只在特定语法位置被当作关键字,其余位置可以当普通标识符用:
编译器不是靠"认出这个词"来区分,而是靠语法位置:出现在类型参数列表后面、声明末尾,就是约束关键字;出现在标识符该出现的地方,就是普通名字。
软关键字 where
where 是 Kotlin 声明泛型上界约束的语法,用途是限制类型参数必须是哪些类型的子类型。
一个约束时
// 单约束,直接写在尖括号里
fun <T : CharSequence> foo(t: T) = t.isEmpty()
多个约束时:必须用 where
fun <T> foo(t: T) where T : CharSequence, T : Comparable<T> { }
// └──────────┬──────────┘
// T 必须同时满足两个上界(且关系,不是或)
Java 对照
| 类型 | Java | Kotlin | 说明 |
|---|---|---|---|
| 单约束 | <T extends CharSequence> |
<T : CharSequence> |
两者都是"上界"(upper bound),冒号与 extends 等价 |
| 多约束 | <T extends CharSequence & Comparable<T>> |
<T> ... where T : CharSequence, T : Comparable<T> |
Java 用 & 连接;Kotlin 的 <T> 里只能写一个上界 ,多个约束必须写在 where 子句中 |
| 类+接口混用 | <T extends Number & Comparable<T>> |
<T : Number> ... where T : Comparable<T> |
两边都要求:类上界只能有一个且放最前,接口可多个 |