Keywords and operators
Hard keywords
The following tokens are always interpreted as keywords and cannot be used as identifiers:
asis used for type casts.
specifies an alias for an import
as?is used for safe type casts.classdeclares a class.continueproceeds to the next step of the nearest enclosing loop.dobegins a do/while loop (a loop with a postcondition).elsedefines the branch of an if expression that is executed when the condition is false.falsespecifies the 'false' value of the Boolean type.forbegins a for loop.fundeclares a function.ifbegins an if expression.inspecifies the object being iterated in a for loop.
is used as an infix operator to check that a value belongs to a range, a collection, or another entity that defines a 'contains' method.
is used in when expressions for the same purpose.
marks a type parameter as contravariant.
!inis used as an operator to check that a value does NOT belong to a range, a collection, or another entity that defines a 'contains' method.
is used in when expressions for the same purpose.
interfacedeclares an interface.ischecks that a value has a certain type.
is used in when expressions for the same purpose.
!ischecks that a value does NOT have a certain type.
is used in when expressions for the same purpose.
nullis a constant representing an object reference that doesn't point to any object.objectdeclares a class and its instance at the same time.packagespecifies the package for the current file.returnreturns from the nearest enclosing function or anonymous function.superthisthrowthrows an exception.truespecifies the 'true' value of the Boolean type.typealiasdeclares a type alias.typeofis reserved for future use.valdeclares a read-only property or local variable.vardeclares a mutable property or local variable.whenbegins a when expression (executes one of the given branches).whilebegins a while loop (a loop with a precondition).
Soft keywords
The following tokens act as keywords in the context in which they are applicable, and they can be used as identifiers in other contexts:
bycatchbegins a block that handles a specific exception type.constructordeclares a primary or secondary constructor.delegateis used as an annotation use-site target.dynamicreferences a dynamic type in Kotlin/JS code.fieldis used as an annotation use-site target.fileis used as an annotation use-site target.finallybegins a block that is always executed when a try block exits.getdeclares the getter of a property.
is used as an annotation use-site target.
importimports a declaration from another package into the current file.initbegins an initializer block.paramis used as an annotation use-site target.propertyis used as an annotation use-site target.receiveris used as an annotation use-site target.setdeclares the setter of a property.
is used as an annotation use-site target.
setparamis used as an annotation use-site target.valuewith theclasskeyword declares an inline class.wherespecifies the constraints for a generic type parameter.
Modifier keywords
The following tokens act as keywords in modifier lists of declarations, and they can be used as identifiers in other contexts:
abstractmarks a class or member as abstract.actualdenotes a platform-specific implementation in multiplatform projects.annotationdeclares an annotation class.companiondeclares a companion object.constmarks a property as a compile-time constant.crossinlineforbids non-local returns in a lambda passed to an inline function.datainstructs the compiler to generate canonical members for a class.enumdeclares an enumeration.expectmarks a declaration as platform-specific, expecting an implementation in platform modules.externalmarks a declaration as implemented outside of Kotlin (accessible through JNI or in JavaScript).finalforbids overriding a member.infixallows calling a function using infix notation.inlinetells the compiler to inline a function and the lambdas passed to it at the call site.innerallows referring to an outer class instance from a nested class.internalmarks a declaration as visible in the current module.lateinitallows initializing a non-nullable property outside of a constructor.noinlineturns off inlining of a lambda passed to an inline function.openallows subclassing a class or overriding a member.operatormarks a function as overloading an operator or implementing a convention.outmarks a type parameter as covariant.overridemarks a member as an override of a superclass member.privatemarks a declaration as visible in the current class or file.protectedmarks a declaration as visible in the current class and its subclasses.publicmarks a declaration as visible anywhere.reifiedmarks a type parameter of an inline function as accessible at runtime.sealeddeclares a sealed class (a class with restricted subclassing).suspendmarks a function or lambda as suspending (usable as a coroutine).tailrecmarks a function as tail-recursive (allowing the compiler to replace recursion with iteration).varargallows passing a variable number of arguments for a parameter.
Special identifiers
The following identifiers are defined by the compiler in specific contexts, and they can be used as regular identifiers in other contexts:
fieldis used inside a property accessor to refer to the backing field of the property.itis used inside a lambda to refer to its parameter implicitly.
Operators and special symbols
Kotlin supports the following operators and special symbols:
+,-,*,/,%- mathematical operators*is also used to pass an array to a vararg parameter.
=assignment operator.
is used to specify default values for parameters.
+=,-=,*=,/=,%=- augmented assignment operators.++,--- increment and decrement operators.&&,||,!- logical 'and', 'or', 'not' operators (for bitwise operations, use the corresponding infix functions instead).==,!=- equality operators (translated to calls ofequals()for non-primitive types).===,!==- referential equality operators.<,>,<=,>=- comparison operators (translated to calls ofcompareTo()for non-primitive types).[,]- indexed access operator (translated to calls ofgetandset).?.performs a safe call (calls a method or accesses a property if the receiver is non-nullable).?:takes the right-hand value if the left-hand value is null (the elvis operator).::creates a member reference or a class reference...,..<create ranges.:separates a name from a type in a declaration.?marks a type as nullable.->separates the parameters and body of a lambda expression.
separates the parameters and return type declaration in a function type.
separates the condition and body of a when expression branch.
@introduces an annotation.
introduces or references a loop label.
introduces or references a lambda label.
references a 'this' expression from an outer scope.
references an outer superclass.
;separates multiple statements on the same line.$references a variable or expression in a string template._substitutes an unused parameter in a lambda expression.
substitutes an unused parameter in a destructuring declaration.
For operator precedence, see this reference in Kotlin grammar.