Kotlin fixes a lot of Java’s sharp edges, but only if you use it idiomatically. These questions check whether a candidate writes Kotlin or Java-in-Kotlin.
Hiring a Kotlin developer is easy. Telling a real one from a convincing résumé is the hard part — and it’s most of what we do. These are grouped by level, because the same question that stretches a junior is a warm-up for a senior.
Junior Kotlin interview questions
0–2 years
Language fundamentals.
How does null safety work in Kotlin?
Types are non-nullable by default; nullable types use ?, and the compiler forces you to handle nulls with ?., ?: or checks.
Uses !! everywhere, defeating null safety.
What is the difference between val and var?
val is a read-only reference, var is reassignable; prefer val for immutability.
Uses var by default with no reason.
What is a data class?
A class that auto-generates equals, hashCode, toString and copy for holding data.
Writes boilerplate equals/hashCode by hand.
What are the safe-call and Elvis operators?
?. calls only if non-null; ?: provides a fallback value; together they replace verbose null checks.
Uses nested if-null checks instead.
What is the difference between == and ===?
== calls equals (structural), === checks referential identity.
Assumes == is reference equality like Java.
What are when expressions?
A powerful switch that can return a value, match ranges/types, and be exhaustive over sealed types.
Writes long if-else chains instead.
What is string templating?
Embedding expressions in strings with $ and ${} rather than concatenation.
Concatenates strings with + everywhere.
What are default and named arguments?
Parameters can have defaults and be passed by name, reducing overloads and improving readability.
Writes many overloads instead of defaults.
Mid-level Kotlin interview questions
2–5 years
Idioms and coroutines.
What are extension functions?
Functions that add behaviour to existing types without inheritance, resolved statically.
Wraps classes unnecessarily to add helpers.
What are coroutines and how do they differ from threads?
Lightweight, suspendable computations for asynchronous code that read sequentially; many coroutines multiplex onto few threads.
Blocks threads instead of suspending.
What is suspend and structured concurrency?
suspend functions can pause without blocking; structured concurrency scopes coroutines so they’re cancelled together and don’t leak.
Launches coroutines with no scope, leaking them.
What are sealed classes and why use them?
Restricted class hierarchies that enable exhaustive when handling, great for modelling states/results.
Uses enums or open classes where sealed fits.
What are higher-order functions and lambdas?
Functions taking or returning functions; lambdas plus the trailing-lambda syntax make DSL-like APIs readable.
Avoids functional style and writes verbose loops.
What do let, apply, run, also, with do?
Scope functions that differ in receiver (this vs it) and return value; used for null handling and configuration.
Uses them randomly without knowing the difference.
What is the difference between a List and a MutableList?
The read-only List interface vs the mutable one; Kotlin encourages immutable collections by default.
Defaults to mutable collections everywhere.
How does Kotlin interoperate with Java?
Seamless two-way interop; platform types from Java can be null, so you add null handling at the boundary.
Trusts Java-returned values as non-null and hits NPEs.
Senior Kotlin interview questions
5+ years
Concurrency, design and Android.
How do coroutine dispatchers and context work?
Dispatchers (Main, IO, Default) decide which thread pool runs the work; you switch context with withContext for the right workload.
Runs blocking IO on the Main dispatcher.
What are Flows and how do they differ from suspend functions?
Cold asynchronous streams of values with operators and backpressure, versus a single suspended result.
Uses one-shot suspend functions where a stream is needed.
How do you handle coroutine exceptions and cancellation?
Cancellation is cooperative and propagates through the scope; use SupervisorJob and handlers where children should fail independently.
Swallows CancellationException and breaks cancellation.
What are inline functions and reified generics for?
inline avoids lambda allocation overhead and enables reified type parameters so generic types are available at runtime.
No idea why some generic functions can inspect types.
How do you design idiomatic APIs in Kotlin?
Immutability, null safety at boundaries, sealed results, extension functions and DSLs where they aid readability.
Writes Java-style APIs in Kotlin.
How do delegated properties work (e.g. by lazy)?
Property access is delegated to an object implementing get/set, enabling lazy initialisation, observables and map-backed properties.
Reimplements lazy initialisation manually and unsafely.
What is Kotlin Multiplatform and its tradeoffs?
Sharing business logic across platforms while keeping native UIs; it reduces duplication but adds build and tooling complexity.
Thinks it means one UI for all platforms.
How do you test coroutine-based code?
A test dispatcher and runTest to control virtual time, making suspending code deterministic.
Adds real delays and flaky sleeps in tests.
Build and score a full interview with our free interview scorecard tool, browse the full question hub, or see how we interview engineers.