Generics
Type Constraints
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
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")
}
prefix ← A
16fun main() {17 val prefix→ A = "A" //@prefix="B", "C"18 val product = Product(prefixA)19 val label = codeLabel(product)fun <T : HasCode> codeLabel(item: T): String
11fun <T : HasCode> codeLabel(item: T): String {12 val code = item.code()13 return "code:$code"override fun code(): String
5class Product(val prefix: String) : HasCode {6 override fun code(): String {7 return "$prefixA-1"8 }code ← A-1
11fun <T : HasCode> codeLabel(item: T): String {12 val code→ A-1 = item.code()13 return "code:$codeA-1"14}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
prefix ← B
16fun main() {17 val prefix→ B = "B"18 val product = Product(prefixB)19 val label = codeLabel(product)fun <T : HasCode> codeLabel(item: T): String
11fun <T : HasCode> codeLabel(item: T): String {12 val code = item.code()13 return "code:$code"override fun code(): String
5class Product(val prefix: String) : HasCode {6 override fun code(): String {7 return "$prefixB-1"8 }code ← B-1
11fun <T : HasCode> codeLabel(item: T): String {12 val code→ B-1 = item.code()13 return "code:$codeB-1"14}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
prefix ← C
16fun main() {17 val prefix→ C = "C"18 val product = Product(prefixC)19 val label = codeLabel(product)fun <T : HasCode> codeLabel(item: T): String
11fun <T : HasCode> codeLabel(item: T): String {12 val code = item.code()13 return "code:$code"override fun code(): String
5class Product(val prefix: String) : HasCode {6 override fun code(): String {7 return "$prefixC-1"8 }code ← C-1
11fun <T : HasCode> codeLabel(item: T): String {12 val code→ C-1 = item.code()13 return "code:$codeC-1"14}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