2015-07-21 41 views
1

试图用多参数组重载方法,其中第二个参数类型不同似乎不起作用。这不会编译:具有过载的斯卡拉方法多个参数组

class Foo { 
    def boo(a: String)(b: String): Unit =() 
    def boo(a: String)(b: Int): Unit = boo(a)(b.toString) 
} 

我本来以为它会被编译成boo(String, String)boo(String,Int)方法,因此是在JVM确定。但我猜不。

我在寻找的是一种解决方法 - 我想保留参数组和重载名称,使其对调用者透明,但是欢迎任何其他黑客。

回答

2

你可以有一个重载的方法apply的中间层:

object Foo { 
    def boo(a: String) = BooMaker(a) 
    case class BooMaker(a: String) { 
     def apply(b: String): Unit =() 
     def apply(b: Int): Unit = apply(b.toString) 
    } 
} 

这将允许你打电话Foo.boo("a")("b")Foo.boo("a")(1),但是引入了潜在的不想要的中间层。

+0

这正是我在寻找的感谢。 – monkjack

1

它需要咖喱吗?由于部分应用,它不会编译。以下应该编译得很好。

class Foo { 
    def boo(a: String, b: String): Unit =() 
    def boo(a: String, b: Int): Unit = boo(a, b.toString) 
} 

如果您可以给您的实际使用案例提供更多的上下文,它可能有助于提供更好的答案。

+0

它需要curried,因为我想第二个参数组块调用。这是一个DSL。 – monkjack