Constrained genericity: Difference between revisions
Content added Content deleted
(Added Sidef) |
(Added Kotlin) |
||
Line 700: | Line 700: | ||
<lang java5>test.<EatableClass>bar();</lang> |
<lang java5>test.<EatableClass>bar();</lang> |
||
The <code>foo</code> method from before can figure out <code>T</code> from its parameter, but this <code>bar</code> method needs to be told what T is. |
The <code>foo</code> method from before can figure out <code>T</code> from its parameter, but this <code>bar</code> method needs to be told what T is. |
||
=={{header|Kotlin}}== |
|||
In the following program we define an interface, Eatable, and two classes - Cheese and Meat - which implement it and must therefore implement its eat() method because the interface itself does not provide a default implementation. |
|||
We then define a generic class, FoodBox, whose type parameter, T, is constrained to an Eatable type and instantiate it using both the Cheese and Meat types: |
|||
<lang scala>// version 1.0.6 |
|||
interface Eatable { |
|||
fun eat() |
|||
} |
|||
class Cheese(val name: String) : Eatable { |
|||
override fun eat() { |
|||
println("Eating $name") |
|||
} |
|||
override fun toString() = name |
|||
} |
|||
class Meat(val name: String) : Eatable { |
|||
override fun eat() { |
|||
println("Eating $name") |
|||
} |
|||
override fun toString() = name |
|||
} |
|||
class FoodBox<T: Eatable> { |
|||
private val foodList = mutableListOf<T>() |
|||
fun add(food: T) { |
|||
foodList.add(food) |
|||
} |
|||
override fun toString() = foodList.toString() |
|||
} |
|||
fun main(args: Array<String>) { |
|||
val cheddar = Cheese("cheddar") |
|||
val feta = Cheese("feta") |
|||
val cheeseBox = FoodBox<Cheese>() |
|||
cheeseBox.add(cheddar) |
|||
cheeseBox.add(feta) |
|||
println("CheeseBox contains : $cheeseBox") |
|||
val beef = Meat("beef") |
|||
val ham = Meat("ham") |
|||
val meatBox = FoodBox<Meat>() |
|||
meatBox.add(beef) |
|||
meatBox.add(ham) |
|||
println("MeatBox contains : $meatBox") |
|||
cheddar.eat() |
|||
beef.eat() |
|||
println("Full now!") |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
CheeseBox contains : [cheddar, feta] |
|||
MeatBox contains : [beef, ham] |
|||
Eating cheddar |
|||
Eating beef |
|||
Full now! |
|||
</pre> |
|||
=={{header|Morfa}}== |
=={{header|Morfa}}== |