Recursive type bounds has a catchy name and sounds rather complicated, but it is actually intuitive once explained. It is an extension of bounded polymorphism, and describes a type that includes one or more type parameters, where at least one of the type parameters uses the type itself.
All will become clearer with an example. Let's say we are writing an API for accounts in a financial system. We want to define an Account
object, and we want to be able to sort all types of account, but with the restriction that we only want to be able to sort accounts of the same type. The first step is defining the interface for our accounts, and a couple of concrete implementations:
interface Account { val balance: BigDecimal } data class SavingsAccount(override val balance: BigDecimal,val interestRate: BigDecimal) : Account, Comparable<SavingsAccount> { override fun compareTo(other: SavingsAccount): Int = balance...