2017-01-04 34 views
0

下面我有一個有目的地複雜的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方法。

回答

1

嘗試

def buildAndRun3[T <: FactoryOf[_],B](factory: T)(f: factory.TheType => B): B = { 
    f(factory.make) 
} 

我懷疑TheTypeFactoryOf類型定義的依賴的論點。這就是爲什麼實際類型取決於給定的實際實例(路徑依賴類型)而不僅僅是類型。

在另一方面,buildAndRun1編譯因爲TheType未在類型BaseFactoryOf定義,它應該在另一種類型的T即後代來定義。它可能被定義爲持久性的,如Int

+0

我不知道我可以使用'''factory.Type'''表達式。 TNX – shayan