这是一个奇怪的情况:
如果我注释掉feed_usingExplicitTypeClassInstance
下面的调用,那么我会收到编译器错误。
非常令人费解。有什么解释吗?
我的意思是,我注释掉一个函数调用(它不返回任何值),然后代码不再编译?
这在理论上应该是可能的吗?在任何编程语言中?
我的意思是我注释掉类似println("hello")
的东西然后代码不再编译了?
当然,如果我注释掉声明之类的东西是可以理解的,但是调用一个不返回任何东西的函数?
object AnimalFeeder extends App {
def feed_usingExplicitTypeClassInstance[AnimalInstance]
(animalTypeClass: AnimalTypeClass[AnimalInstance])
(food: animalTypeClass.FoodThatAnimalLikes) =
{
animalTypeClass.feed(food)
}
def feed_usingImplicitTypeClassInstance[AnimalInstance, Food]
(food: Food)
(implicit animalTypeClass: AnimalTypeClass.Aux[Food,AnimalInstance]) =
{
animalTypeClass.feed(food)
}
// If I comment out this line, THEN !, I get an error !!!! How ???
feed_usingExplicitTypeClassInstance(AnimalTypeClass.CatInstance)(new CatFood())
feed_usingImplicitTypeClassInstance(new CatFood)
}
trait Food {
def eat(): Unit
}
trait AnimalTypeClass[AnimalInstance] {
type FoodThatAnimalLikes <: Food
def feed(f: FoodThatAnimalLikes) = f.eat()
}
object AnimalTypeClass {
type Aux[Food, Animal] = AnimalTypeClass[Animal] {
type FoodThatAnimalLikes = Food
}
implicit object CatInstance extends AnimalTypeClass[Cat] {
override type FoodThatAnimalLikes = CatFood
}
}
trait Cat
class CatFood extends Food {
override def eat(): Unit = println("meow")
}
这是错误:
Error:(23, 38) could not find implicit value for parameter animalTypeClass: AnimalTypeClass.Aux[CatFood,AnimalInstance]
feed_usingImplicitTypeClassInstance(new CatFood)
Error:(23, 38) not enough arguments for method feed_usingImplicitTypeClassInstance: (implicit animalTypeClass: AnimalTypeClass.Aux[CatFood,AnimalInstance])Unit.
Unspecified value parameter animalTypeClass.
feed_usingImplicitTypeClassInstance(new CatFood)
编辑:
如果我插入该行:
AnimalTypeClass.CatInstance
前:
feed_usingImplicitTypeClassInstance(new CatFood)
然后代码再次编译,即使该行
feed_usingExplicitTypeClassInstance(AnimalTypeClass.CatInstance)(new CatFood())
被注释掉了。