2013-01-23 42 views
1
object GoodReturnType extends Dynamic { 
    def applyDynamic(method: String)(args: Any*) = { 
    method match { 
     case "foo" => 25 
     case "bar" => 14 
    } 
    } 
} 

方法GoodReturnType對象的applyDynamic具有詮釋返回類型。正如預期的那樣,其動態方法的調用也會返回Int我可以創建一個具有不同返回類型的多個動態方法的類嗎?

scala> GoodReturnType.foo() 
res0: Int = 25 

如果我們嘗試添加另一個動態方法具有不同的返回類型,返回applyDynamic的類型將是最常見的類型(這是任何)。所有動態方法都如此。

object BadReturnType extends Dynamic { 
    def applyDynamic(method: String)(args: Any*) = { 
    method match { 
     case "foo" => 25 
     case "bar" => 14 
     case "baz" => "muahahaha!" 
    } 
    } 
} 

scala> BadReturnType.foo() 
res1: Any = 25 

是否有可能具有不同返回類型的多個動態方法的類?

回答

3

原則上這是不可能的,因爲您是基於動態信息進行調度。因此,即使你有一種特定方式的響應,調用代碼也不知道哪些類型是從可用集合中返回的。如果需要,您可以使用Either明確表示(例如,Left(5)Right("muahaha")將返回Either[Int,String]),但從根本上講,在完成動態分派步驟後,您無法保留靜態類型。如果您不打算將其用作動態調度步驟,那麼爲什麼不直接使用該方法呢?

+0

>爲什麼不直接使用該方法?只是一個句法示例,儘可能簡單。問這個問題,因爲我很好奇,如果可以創建「動態」orm:user.findById(id:Id):User; user.findAll():List [User],user.whereAgeGt(21):List [User];如你所見,返回類型是不同的。我的猜測是「特徵記錄擴展動態」與解析器內invokeDynamic方法,但這不會工作,因爲我明白 – Jeriho

2

不,你不能。有一組固定的,預先確定的所有非靜態檢查參考映射到的Dynamic方法。 JVM不支持僅基於返回類型的方法解析,因此您必須爲給定的參數簽名選擇單個實現。

如果您還沒有,請研究SIP 17: Type Dynamic

相關問題