2015-07-21 71 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