trait SimpleJob[+T <: Serializable, +R <: Serializable] {
def dostuff[T](message : T) : R
}
object SimpleJob {
def get_or_create_job(name : String) = print("do stuff")
def apply[T, R](name : String, message : T) : Future[R] = Future{"do stuff".asInstanceOf[R]}
def apply[S <: SimpleJob[T, R]](message : T) : Future[R] = this(classOf[S].getName, message)
}
未能編譯,因爲編譯器不能在第二應用方法解決T,R或S。
關於這個例子的注意事項:我已經拿出了所有的函數體來使其具有最小的可重複性。如果R不是字符串,此示例將失敗。如果任何人有興趣,我試圖做的是爲有限形式的安卡阿卡演員製作一個結構。這個想法是,SimpleJob可以被子類化和參數化,然後消息傳遞給所有的子類actor,並通過調用形式爲SimpleJob [ActorSubclassType] .apply(message)的對象來傳遞,其中參數和返回值將是type -安全。 apply方法是檢查給定類的actor是否已經實例化,如果沒有,則創建它,然後傳遞該消息並返回Future作爲答覆。事實證明,由於多種原因,這是不可行的,但是沿途我意識到有些東西我不瞭解scala的內嵌系統,我試圖找出那些是什麼,所以我不會類似兔子洞再次。
如果我添加兩個參數是這樣的:
def apply[S <: SimpleJob[T, R], T, R](message : T) : Future[R] = this(classOf[S].getName, message)
它編譯,但我希望能夠只用一個類型參數的功能,因爲它徹底解決了其他類型。
如果有人能幫助我理解我對scala的類型系統顯然存在誤解,我將不勝感激。
在此先感謝。
'dostuff [T]'從'SimpleJob'投影'T'類型參數 – cchantep
是的......故意的。但那又如何?未能編譯的部分是對象,並且在這個最小可重現的示例中,我已經消除了依賴於特徵方法的對象應用方法中的任何引用。 – Bob
你的例子沒有太大意義。 'S.getClass'是不可能的,因爲'S'只是類型的_name_。你不能'String.getClass',可以嗎? '.getClass'是一個實例方法:你必須有一個'S'實例來調用'.getClass'。 '「做東西」.asInstanceOf [R]'也沒有任何意義:如果'R'不是字符串,它會崩潰。有一個參數沒有意義,只能有一個值。 我明白了,你的意思是爲了舉例簡化它,但看起來你走得太遠了:它並沒有解釋你實際上試圖做什麼 – Dima