Keywords and Operators
Hard Keywords
The following tokens are always interpreted as keywords and cannot be used as identifiers:
as- is used for type casts
- specifies an alias for an import
as?is used for safe type castsbreakterminates the execution of a loopclassdeclares a classcontinueproceeds to the next step of the nearest enclosing loopdobegins a do/while loop (loop with postcondition)elsedefines the branch of an if expression which is executed when the condition is falsefalsespecifies the ‘false’ value of the Boolean typeforbegins a for loopfundeclares a functionifbegins an if expressionin- specifies 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 the ‘contains’ method
- is used in when expressions for the same purpose
- marks a type parameter as contravariant
!in- is used as an operator to check that a value does NOT belong to a range, a collection or another entity that defines the ‘contains’ method
- is used in when expressions for the same purpose
interfacedeclares an interfaceis- checks that a value has a certain type
- is used in when expressions for the same purpose
!is- checks 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 objectobjectdeclares a class and its instance at the same timepackagespecifies the package for the current filereturnreturns from the nearest enclosing function or anonymous functionsuper- refers to the superclass implementation of a method or property
- calls the superclass constructor from a secondary constructor
this- refers to the current receiver
- calls another constructor of the same class from a secondary constructor
throwthrows an exceptiontruespecifies the ‘true’ value of the Boolean typetrybegins an exception handling blocktypealiasdeclares a type aliastypeofreserved for future usevaldeclares a read-only property or local variablevardeclares a mutable property or local variablewhenbegins a when expression (executes one of the given branches)whilebegins a while loop (loop with precondition)
Soft Keywords
The following tokens act as keywords in the context when they are applicable and can be used as identifiers in other contexts:
by- delegates the implementation of an interface to another object
- delegates the implementation of accessors for a property to another object
catchbegins a block that handles a specific exception typeconstructordeclares a primary or secondary constructordelegateis used as an annotation use-site targetdynamicreferences a dynamic type in Kotlin/JS codefieldis used as an annotation use-site targetfileis used as an annotation use-site targetfinallybegins a block that is always executed when a try block exitsget- declares the getter of a property
- is used as an annotation use-site target
importimports a declaration from another package into the current fileinitbegins an initializer blockparamis used as an annotation use-site targetpropertyis used as an annotation use-site targetreceiveris used as an annotation use-site targetset- declares the setter of a property
- is used as an annotation use-site target
setparamis used as an annotation use-site targetwherespecifies constraints for a generic type parameter
Modifier Keywords
The following tokens act as keywords in modifier lists of declarations and can be used as identifiers in other contexts:
actualdenotes a platform-specific implementation in multiplatform projectsabstractmarks a class or member as abstractannotationdeclares an annotation classcompaniondeclares a companion objectconstmarks a property as a compile-time constantcrossinlineforbids non-local returns in a lambda passed to an inline functiondatainstructs the compiler to generate canonical members for a classenumdeclares an enumerationexpectmarks a declaration as platform-specific, expecting an implementation in platform modules.externalmarks a declaration as implemented not in Kotlin (accessible through JNI or in JavaScript)finalforbids overriding a memberinfixallows calling a function in infix notationinlinetells the compiler to inline the function and the lambdas passed to it at the call siteinnerallows referring to the outer class instance from a nested classinternalmarks a declaration as visible in the current modulelateinitallows initializing a non-null property outside of a constructornoinlineturns off inlining of a lambda passed to an inline functionopenallows subclassing a class or overriding a memberoperatormarks a function as overloading an operator or implementing a conventionoutmarks a type parameter as covariantoverridemarks a member as an override of a superclass memberprivatemarks a declaration as visible in the current class or fileprotectedmarks a declaration as visible in the current class and its subclassespublicmarks a declaration as visible anywherereifiedmarks a type parameter of an inline function as accessible at runtimesealeddeclares 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 can be used as regular identifiers in other contexts:
fieldis used inside a property accessor to refer to the backing field of the propertyitis 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 corresponding infix functions)==,!=- 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)!!asserts that an expression is non-null?.performs a safe call (calls a method or accesses a property if the receiver is non-null)?:takes the right-hand value if the left-hand value is null (the elvis operator)::creates a member reference or a class reference..creates a range:separates a name from a type in declarations?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
