Allow a generic box to hold a missing value.

nullable-generic A generic type argument can be nullable, just like a regular type.

Nullable Generics

input
NullableGenerics.kt
Replay: real traced execution (multi-file project)
class MaybeBox<T>(val value: T?) {
    fun orFallback(fallback: T): T {
        if (value == null) {
            return fallback
        }
        return value
    }
}

fun main() {
    val input: String? = "Ada"
    val box = MaybeBox(input)
    val name = box.orFallback("guest")

    println("input=${input ?: "none"}")
    println("name=$name")
}
class MaybeBox<T>(val value: T?) {
    fun orFallback(fallback: T): T {
        if (value == null) {
            return fallback
        }
        return value
    }
}

fun main() {
    val input: String? = null
    val box = MaybeBox(input)
    val name = box.orFallback("guest")

    println("input=${input ?: "none"}")
    println("name=$name")
}
class MaybeBox<T>(val value: T?) {
    fun orFallback(fallback: T): T {
        if (value == null) {
            return fallback
        }
        return value
    }
}

fun main() {
    val input: String? = "Bo"
    val box = MaybeBox(input)
    val name = box.orFallback("guest")

    println("input=${input ?: "none"}")
    println("name=$name")
}
  1. input ← Ada

    10fun main() {11    val input→ Ada: String? = "Ada" //@input=null, "Bo"12    val box = MaybeBox(inputAda)13    val name = box.orFallback("guest")
  2. fun orFallback(fallback: T): T

    1class MaybeBox<T>(val value: T?) {2    fun orFallback(fallbackguest: T): T {3        if (value == null) {4            return fallback5        }6        return valueAda7    }
  3. name ← Ada

    12    val box = MaybeBox(input)13    val name→ Ada = box.orFallback("guest")1415    println("input=${inputAda ?: "none"}")16    println("name=$nameAda")17}
    outputinput=Ada
    name=Ada
  1. input ← null

    10fun main() {11    val input→ null: String? = null12    val box = MaybeBox(inputnull)13    val name = box.orFallback("guest")
  2. fun orFallback(fallback: T): T

    1class MaybeBox<T>(val value: T?) {2    fun orFallback(fallbackguest: T): T {3        if (value == null) {
  3. if (value == null)

    2fun orFallback(fallback: T): T {3    if (valuenull == null) {4        return fallbackguest5    }
  4. name ← guest

    12    val box = MaybeBox(input)13    val name→ guest = box.orFallback("guest")1415    println("input=${inputnull ?: "none"}")16    println("name=$nameguest")17}
    outputinput=none
    name=guest
  1. input ← Bo

    10fun main() {11    val input→ Bo: String? = "Bo"12    val box = MaybeBox(inputBo)13    val name = box.orFallback("guest")
  2. fun orFallback(fallback: T): T

    1class MaybeBox<T>(val value: T?) {2    fun orFallback(fallbackguest: T): T {3        if (value == null) {4            return fallback5        }6        return valueBo7    }
  3. name ← Bo

    12    val box = MaybeBox(input)13    val name→ Bo = box.orFallback("guest")1415    println("input=${inputBo ?: "none"}")16    println("name=$nameBo")17}
    outputinput=Bo
    name=Bo