2013-01-23 41 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

相关问题