【发布时间】:2015-10-23 04:19:19
【问题描述】:
作为学习 Scala 的“蛋糕”模式的一部分,我正在试验类型变量和结构类型。
下面是一个说明我的问题的玩具 API:
当结构类型“B”中定义的方法是 结构类型“A”,为什么我不能将 B 的实例传递给需要“A”的方法?
... Toy API ....
object Tester extends App {
trait SomeApi {
type Organism <: {
def die(): Unit;
}
type Dog <: {
def die(): Unit;
def bark(): Unit;
}
def dieQuietlyDoesntCompile(entity: Organism): Unit = {
entity.die()
}
def dieQuietly(entity: { def die(): Unit }): Unit = {
entity.die()
}
def processDog(dog: Dog): Unit = {
println("start dog process on : " + dog)
dieQuietly(dog)
}
}
}
我的 API 中的结构类型从您可能称之为“基本类型”(上例中的有机体)开始,另外,我 API 中有其他类型扩展基本类型。在 Toy API 的情况下,Dog 拥有 Organism 的所有方法,另外还有 还有一个:'bark()'。
我想编写一些对基本类型进行操作的辅助方法,如 processDog() 方法 .... 它接受一个“Dog”实例,但它也想调用“dieQuietly” 处理更通用的类型“有机体”。
我上面做的事情的方式是可行的,但是它真的很笨拙,因为我必须完全重复所有的方法 基础结构类型。在这个玩具案例中还不错(因为我只有一个方法:die()),但对于这些结构类型中的方法数量来说真的很尴尬 增加。
因此,我宁愿将 dog 实例传递给类似“dieQuietlyDoesntCompile()”这样编写的方法。
但正如该函数名称所示,如果我将 Dog 实例传递给它,则它无法编译并出现错误:
类型不匹配;找到:dog.type(具有基础类型 SomeApi.this.Dog) 需要:SomeApi.this.Organism
谁能建议一种更方便的方法来实现我的目标...?还是我坚持重复基本类型中的方法? (一种对我来说似乎不太干燥的方法)。在此先感谢您的帮助 ! /克里斯
【问题讨论】:
标签: scala polymorphism duck-typing