【发布时间】:2017-01-04 02:53:06
【问题描述】:
下面我有一个故意复杂的 Hello World 应用程序,我终其一生都无法弄清楚为什么 buildAndRun2 方法无法编译。
abstract class BaseFactoryOf[A]{
type TheType
def make: TheType
}
abstract class FactoryOf[A] extends BaseFactoryOf[A]{
final type TheType = A
}
class HelloWorld {
def execute: String = "Hello World!"
}
class HelloWorldFactory extends FactoryOf[HelloWorld] {
def make: TheType = new HelloWorld
}
def buildAndRun1[T <: BaseFactoryOf[_],B](factory: T)(f: T#TheType => B): B ={
f(factory.make)
}
def buildAndRun2[T <: FactoryOf[_],B](factory: T)(f: T#TheType => B): B ={
f(factory.make)
} //This doesn't compile due to a type mismatch error. But Why?!
//Client Code
buildAndRun1(new HelloWorldFactory)(i => i.execute) // This Works!
buildAndRun2(new HelloWorldFactory)(i => i.execute) // Epic Fail!
无用的中级FactoryOf[A]其实是为了介绍问题而写的。我很确定这与type TheType 有关,但它是什么?!如果有的话,它是无用的中间 FactoryOf 类,它允许我验证 type TheType 与 A 相同,所以按照这个逻辑,我应该更有信心使用 buildAndRun2 方法。
【问题讨论】:
标签: scala types type-alias