Require a generic value to provide a known operation.

type-constraint A type constraint lets generic code call members promised by an interface or superclass.

Type Constraints

prefix
TypeConstraints.kt
Replay: real traced execution (multi-file project)
interface HasCode {
    fun code(): String
}

class Product(val prefix: String) : HasCode {
    override fun code(): String {
        return "$prefix-1"
    }
}

fun <T : HasCode> codeLabel(item: T): String {
    val code = item.code()
    return "code:$code"
}

fun main() {
    val prefix = "A"
    val product = Product(prefix)
    val label = codeLabel(product)

    println("prefix=$prefix")
    println("label=$label")
}
interface HasCode {
    fun code(): String
}

class Product(val prefix: String) : HasCode {
    override fun code(): String {
        return "$prefix-1"
    }
}

fun <T : HasCode> codeLabel(item: T): String {
    val code = item.code()
    return "code:$code"
}

fun main() {
    val prefix = "B"
    val product = Product(prefix)
    val label = codeLabel(product)

    println("prefix=$prefix")
    println("label=$label")
}
interface HasCode {
    fun code(): String
}

class Product(val prefix: String) : HasCode {
    override fun code(): String {
        return "$prefix-1"
    }
}

fun <T : HasCode> codeLabel(item: T): String {
    val code = item.code()
    return "code:$code"
}

fun main() {
    val prefix = "C"
    val product = Product(prefix)
    val label = codeLabel(product)

    println("prefix=$prefix")
    println("label=$label")
}
  1. prefix ← A

    16fun main() {17    val prefix→ A = "A" //@prefix="B", "C"18    val product = Product(prefixA)19    val label = codeLabel(product)
  2. fun <T : HasCode> codeLabel(item: T): String

    11fun <T : HasCode> codeLabel(item: T): String {12    val code = item.code()13    return "code:$code"
  3. override fun code(): String

    5class Product(val prefix: String) : HasCode {6    override fun code(): String {7        return "$prefixA-1"8    }
  4. code ← A-1

    11fun <T : HasCode> codeLabel(item: T): String {12    val code→ A-1 = item.code()13    return "code:$codeA-1"14}
  5. label ← code:A-1

    18    val product = Product(prefix)19    val label→ code:A-1 = codeLabel(product)2021    println("prefix=$prefixA")22    println("label=$labelcode:A-1")23}
    outputprefix=A
    label=code:A-1
  1. prefix ← B

    16fun main() {17    val prefix→ B = "B"18    val product = Product(prefixB)19    val label = codeLabel(product)
  2. fun <T : HasCode> codeLabel(item: T): String

    11fun <T : HasCode> codeLabel(item: T): String {12    val code = item.code()13    return "code:$code"
  3. override fun code(): String

    5class Product(val prefix: String) : HasCode {6    override fun code(): String {7        return "$prefixB-1"8    }
  4. code ← B-1

    11fun <T : HasCode> codeLabel(item: T): String {12    val code→ B-1 = item.code()13    return "code:$codeB-1"14}
  5. label ← code:B-1

    18    val product = Product(prefix)19    val label→ code:B-1 = codeLabel(product)2021    println("prefix=$prefixB")22    println("label=$labelcode:B-1")23}
    outputprefix=B
    label=code:B-1
  1. prefix ← C

    16fun main() {17    val prefix→ C = "C"18    val product = Product(prefixC)19    val label = codeLabel(product)
  2. fun <T : HasCode> codeLabel(item: T): String

    11fun <T : HasCode> codeLabel(item: T): String {12    val code = item.code()13    return "code:$code"
  3. override fun code(): String

    5class Product(val prefix: String) : HasCode {6    override fun code(): String {7        return "$prefixC-1"8    }
  4. code ← C-1

    11fun <T : HasCode> codeLabel(item: T): String {12    val code→ C-1 = item.code()13    return "code:$codeC-1"14}
  5. label ← code:C-1

    18    val product = Product(prefix)19    val label→ code:C-1 = codeLabel(product)2021    println("prefix=$prefixC")22    println("label=$labelcode:C-1")23}
    outputprefix=C
    label=code:C-1