先拋出一個現實與代碼不兼容的問題。ide
如下代碼奶牛吃草是正常的,但你把魚也餵給奶牛,它居然也吃起來了。這顯然是不合理的。學習
scala經過type
抽象類型解決這個問題ui
class Food class Grass extends Food{ override def toString: String = "草" } class Fish extends Food{ override def toString: String = "魚" } abstract class Animal{ def eat(food: Food) } class Cow extends Animal { override def eat(food: Food): Unit = println(s"奶牛吃 $food") } val cow = new Cow cow.eat(new Grass) cow.eat(new Fish)
class Food class Grass extends Food{ override def toString: String = "草" } class Fish extends Food{ override def toString: String = "魚" } abstract class Animal{ type SuitableFood <: Food def eat(food: SuitableFood) } class Cow extends Animal { override type SuitableFood = Grass override def eat(food: Grass): Unit = println(s"奶牛吃 $food") } val cow = new Cow cow.eat(new Grass) cow.eat(new Fish)