Compatibility guide for Kotlin 2.0
Keeping the Language Modern and Comfortable Updates are among the fundamental principles in Kotlin Language Design. The former says that constructs which obstruct language evolution should be removed, and the latter says that this removal should be well-communicated beforehand to make code migration as smooth as possible.
While most of the language changes were already announced through other channels, like updated changelogs or compiler warnings, this document provides a complete reference for migration from Kotlin 1.9 to Kotlin 2.0.
note
The Kotlin K2 compiler is introduced as part of Kotlin 2.0. For information on the benefits of the new compiler, changes you might encounter during migration, and how to roll back to the previous compiler, see K2 compiler migration guide.
In this document we introduce several kinds of compatibility:
source: source-incompatible change stops code that used to compile fine (without errors or warnings) from compiling anymore
binary: two binary artifacts are said to be binary-compatible if interchanging them doesn't lead to loading or linkage errors
behavioral: a change is said to be behavioral-incompatible if the same program demonstrates different behavior before and after applying the change
Remember that those definitions are given only for pure Kotlin. Compatibility of Kotlin code from the other languages perspective (for example, from Java) is out of the scope of this document.
tip
Issue: KT-54309
Component: Core language
Incompatible change type: source
Short summary: If you use the synthetic setter of a Java class to assign a type that conflicts with the class's projected type, an error is triggered.
Deprecation cycle:
1.8.20: report a warning when a synthetic property setter has a projected parameter type in contravariant position making call-site argument types incompatible
2.0.0: raise the warning to an error
Correct mangling when calling functions with inline class parameters that are overloaded in a Java subclass
tip
Issue: KT-56545
Component: Core language
Incompatible change type: behavioral
Deprecation cycle:
2.0.0: use the correct mangling behavior in function invocations; to revert to the previous behaviour, use the
-XXLanguage:-MangleCallsToJavaMethodsWithValueClasses
compiler option.
tip
Issue: KT-49404
Component: Core language
Incompatible change type: source
Deprecation cycle:
1.8.20: report a warning on problematic calls
2.0.0: raise the warning to an error
tip
Issue: KT-56408
Component: Core language
Incompatible change type: source
Deprecation cycle:
2.0.0: report an error when a property is accessed before initialization in the affected contexts
tip
Issue: KT-57750
Component: Core language
Incompatible change type: source
Deprecation cycle:
2.0.0: report an error when resolving a class name that is present in several packages imported with a star import
tip
Issue: KT-45375
Component: Core language
Incompatible change type: behavioral
Deprecation cycle:
2.0.0: implement new behavior; lambdas are generated using
invokedynamic
andLambdaMetafactory
by default
tip
Issue: KT-57871
Component: Core language
Incompatible change type: source
Deprecation cycle:
2.0.0: report an error in case the
if
condition has only one branch
tip
Issue: KT-61718
Component: Core language
Incompatible change type: source
Deprecation cycle:
2.0.0: report an error when self upper bounds are violated by passing a star-projection of a generic type
tip
Issue: KT-54862
Component: Core language
Incompatible change type: source
Deprecation cycle:
1.9.0: report a warning on private inline functions if the inferred return type contains an anonymous type
2.0.0: approximate return type of such private inline functions to a supertype
Change overload resolution behavior to prioritize local extension function calls over invoke conventions of local functional type properties
tip
Issue: KT-37592
Component: Core language
Incompatible change type: behavioral
Deprecation cycle:
2.0.0: new overload resolution behavior; function calls are consistently prioritized over invoke conventions
Report error when an inherited member conflict occurs due to a change in a supertype from binary dependency
tip
Issue: KT-51194
Component: Core language
Incompatible change type: source
Deprecation cycle:
1.7.0: report a warning CONFLICTING_INHERITED_MEMBERS_WARNING on declarations where inherited member conflict has occurred in the supertype from binary dependency
2.0.0: raise the warning to an error: CONFLICTING_INHERITED_MEMBERS
tip
Issue: KT-57609
Component: Core language
Incompatible change type: source
Deprecation cycle:
2.0.0: implement new behavior; the
@UnsafeVariance
annotation is ignored when reporting errors about type mismatch in contravariant parameters
tip
Issue: KT-54316
Component: Core language
Incompatible change type: source
Deprecation cycle:
1.8.20: report a warning on a companion object function reference type inferred as an unbound reference
2.0.0: change the behavior so that companion object function references are inferred as bound references in all usage contexts
tip
Issue: KT-33917
Component: Core language
Incompatible change type: source
Deprecation cycle:
1.3.0: report a warning on calls to own members of anonymous objects, returned from private inline functions
2.0.0: approximate return type of such private inline functions to a supertype and don't resolve calls to anonymous object members
tip
Issue: KT-22379
Component: Core language
Incompatible change type: source
Deprecation cycle:
2.0.0: implement new behavior; the old behavior can be restored by switching to language version 1.9
Report error when a variable of an intersection type is assigned a value that is not a subtype of that intersection type
tip
Issue: KT-53752
Component: Core language
Incompatible change type: source
Deprecation cycle:
2.0.0: report an error when a variable having an intersection type is assigned a value that is not a subtype of that intersection type
Require opt-in when an interface constructed with a SAM constructor contains a method that requires an opt-in
tip
Issue: KT-52628
Component: Core language
Incompatible change type: source
Deprecation cycle:
1.7.20: report a warning for
OptIn
usages via SAM constructor2.0.0: raise the warning to an error for
OptIn
usages via SAM constructor (or keep reporting the warning ifOptIn
marker severity is a warning)
tip
Issue: KT-54066
Component: Core language
Incompatible change type: source
Deprecation cycle:
1.8.0: introduce a warning for cases when the upper bound is violated in typealias constructors
2.0.0: raise the warning to an error in the K2 compiler
tip
Issue: KT-57011
Component: Core language
Incompatible change type: source
Deprecation cycle:
2.0.0: implement new behavior; the real type of destructuring variable is now consistent with the explicit type when specified
Require opt-in when calling a constructor that has parameter types with default values that require an opt-in
tip
Issue: KT-55111
Component: Core language
Incompatible change type: source
Deprecation cycle:
1.8.20: report a warning on constructor calls that has parameter types which require opt-in
2.0.0: raise the warning to an error (or keep reporting a warning if the
OptIn
marker severity is a warning)
tip
Issue: KT-52802
Component: Core language
Incompatible change type: source
Deprecation cycle:
1.7.20: report a warning when the compiler resolves to a property instead of an enum entry at the same scope level
2.0.0: report ambiguity when the compiler encounters both a property and an enum entry with the same name at the same scope level in the K2 compiler (leaving the warning as is in the old compiler)
tip
Issue: KT-47310
Component: Core language
Incompatible change type: source
Deprecation cycle:
2.0.0: implement new resolution behavior; companion property is preferred over enum entry
tip
Issue: KT-58260
Component: Core language
Incompatible change type: source
Deprecation cycle:
2.0.0: resolve invoke call receiver type and the invoke function type independently as if they were written in a desugared form
tip
Issue: KT-55179
Component: Core language
Incompatible change type: source
Deprecation cycle:
1.9.0: report the
PRIVATE_CLASS_MEMBER_FROM_INLINE_WARNING
warning when calling private class companion object member from internal inline functions2.0.0: raise this warning to the
PRIVATE_CLASS_MEMBER_FROM_INLINE
error
tip
Issue: KT-54663
Component: Core language
Incompatible change type: source
Deprecation cycle:
2.0.0: implement new behavior; projected types take into account all in-place not-null types
Change inferred type of prefix increment to match getter's return type instead of inc() operator's return type
tip
Issue: KT-57178
Component: Core language
Incompatible change type: source
Deprecation cycle:
2.0.0: implement new behavior; inferred type of prefix increment is changed to match getter's return type instead of the
inc()
operator's return type
Enforce bound checks when inheriting inner classes from generic inner classes declared in superclasses
tip
Issue: KT-61749
Component: Core language
Incompatible change type: source
Deprecation cycle:
2.0.0: report an error when upper bound of the type parameter of a generic inner superclass is violated
Forbid assigning callable references with SAM types when the expected type is a function type with a function type parameter
tip
Issue: KT-64342
Component: Core language
Incompatible change type: source
Deprecation cycle:
2.0.0: report a compilation error on callable references with SAM types when the expected type is a function type with a function type parameter
tip
Issue: KT-64299
Component: Core language
Incompatible change type: behavioral
Deprecation cycle:
2.0.0: implement new behavior; the companion object scope is now not ignored during annotation resolution on companion objects
tip
Issue: KT-41034
Component: Core language
Incompatible change type: behavioral
Deprecation cycle:
1.4.0: report warnings on each incorrect call
2.0.0: implement new resolution behavior
tip
Issue: KT-58589
Component: Core language
Incompatible change type: behavioral
Deprecation cycle:
1.9.20: introduce the
MUST_BE_INITIALIZED
warning for cases where there is no primary constructor2.0.0: raise the warning to an error
tip
Issue: KT-61182
Component: Core language
Incompatible change type: behavioral
Deprecation cycle:
2.0.0: report an error when Unit conversion is applied to an arbitrary expression on variable and invoke resolution; use the
-XXLanguage:+UnitConversionsOnArbitraryExpressions
compiler option to keep the previous behavior with affected expressions.
tip
Issue: KT-62998
Component: Core language
Incompatible change type: source
Deprecation cycle:
2.0.0: report to an error in case a nullable is assigned to a non-null Java field
tip
Issue: KT-57600
Component: Core language
Incompatible change type: source
Deprecation cycle:
2.0.0: implement new behavior; overriding is forbidden for raw type parameters
tip
Issue: KT-47313
Component: Core language
Incompatible change type: behavioral
Deprecation cycle:
1.6.0: report a warning on callable references currently bound to companion object instances
2.0.0: implement new behavior; adding parentheses around a type no longer makes it a reference to the type's companion object instance
tip
Issue: KT-54997
Component: Core language
Incompatible change type: source
Deprecation cycle:
1.8.20: report a compilation warning when implicit non-public API is accessed in public inline functions
2.0.0: raise the warning to an error
tip
Issue: KT-57422
Component: Core language
Incompatible change type: source
Deprecation cycle:
1.9.0: report a warning (an error in the progressive mode) on use-site
get
annotations on getters2.0.0: raise the warning to the
INAPPLICABLE_TARGET_ON_PROPERTY
error; use-XXLanguage:-ProhibitUseSiteGetTargetAnnotations
to revert to a warning
Prevent implicit inference of type parameters into upper bounds in builder inference lambda functions
tip
Issue: KT-47986
Component: Core language
Incompatible change type: source
Deprecation cycle:
1.7.20: report a warning (or an error in the progressive mode) when the type parameter for a type argument cannot be inferred into declared upper bounds
2.0.0: raise the warning to an error
tip
Issue: KT-53982
Component: Core language
Incompatible change type: source
Deprecation cycle:
1.8.0: flexible types are approximated by flexible supertypes; report a warning when a declaration is inferred to have a non-nullable type that should be nullable, prompting to specify the type explicitly to avoid NPEs
2.0.0: nullable types are approximated by nullable supertypes
tip
Issue: KT-65776
Component: Core language
Incompatible change type: source
Deprecation cycle:
2.0.0: implement new behavior; no special handling for
false && ...
andfalse || ...
tip
Issue: KT-34372
Component: Core language
Incompatible change type: source
Deprecation cycle:
1.8.0: report a warning on inline open functions in enums
2.0.0: raise the warning to an error
tip
Issue: KT-64653
Component: Gradle
Incompatible change type: source
Short summary: Previously, certain Kotlin DSL functions and properties intended for a specific DSL context would inadvertently leak into other DSL contexts. We've added the
@KotlinGradlePluginDsl
annotation, which prevents the exposure of the Kotlin Gradle plugin DSL functions and properties to levels where they are not intended to be available. The following levels are separated from each other:
Kotlin extension
Kotlin target
Kotlin compilation
Kotlin compilation task
Deprecation cycle:
2.0.0: for most popular cases, the compiler reports warnings with suggestions on how to fix them if your build script is configured incorrectly; otherwise, the compiler reports an error
tip
Issue: KT-63419
Component: Gradle
Incompatible change type: source
Short summary: The ability to configure compiler options through the
kotlinOptions
DSL and the relatedKotlinCompile<KotlinOptions>
task interface have been deprecated.Deprecation cycle:
2.0.0: report a warning
tip
Issue: KT-65568
Component: Gradle
Incompatible change type: source
Short summary: The ability to configure the
compilerOptions
property in theKotlinCompilation
DSL has been deprecated.Deprecation cycle:
2.0.0: report a warning
tip
Issue: KT-62795
Component: Gradle
Incompatible change type: source
Short summary: the
CInteropProcess
task and theCInteropSettings
class now use thedefinitionFile
property instead ofdefFile
anddefFileProperty
.This eliminates the need to add extra
dependsOn
relations between theCInteropProcess
task and the task that generatesdefFile
when thedefFile
is dynamically generated.In Kotlin/Native projects, Gradle now lazily verifies the presence of the
definitionFile
property after the connected task has run later in the build process.Deprecation cycle:
2.0.0:
defFile
anddefFileProperty
parameters are deprecated
tip
Issue: KT-64379
Component: Gradle
Incompatible change type: behavioral
Short summary: The
kotlin.useK2
Gradle property has been removed. In Kotlin 1.9.*, it could be used to enable the K2 compiler. In Kotlin 2.0.0 and later, the K2 compiler is enabled by default, so the property has no effect and cannot be used to switch back to the previous compiler.Deprecation cycle:
1.8.20: the
kotlin.useK2
Gradle property is deprecated2.0.0: the
kotlin.useK2
Gradle property is removed
tip
Issue: KT-65187
Component: Gradle
Incompatible change type: source
Short summary: support for these platform plugin IDs have been removed:
kotlin-platform-android
kotlin-platform-jvm
kotlin-platform-js
org.jetbrains.kotlin.platform.android
org.jetbrains.kotlin.platform.jvm
org.jetbrains.kotlin.platform.js
Deprecation cycle:
1.3: the platform plugin IDs are deprecated
2.0.0: the platform plugin IDs are no longer supported
tip
Issue: KT-61116
Component: Gradle
Incompatible change type: source
Short summary: The
outputFile
JavaScript compiler option has been removed. Instead, you can use thedestinationDirectory
property of theKotlin2JsCompile
task to specify the directory where the compiled JavaScript output files are written.Deprecation cycle:
1.9.25: the
outputFile
compiler option is deprecated2.0.0: the
outputFile
compiler option is removed
Thanks for your feedback!