Укажите сигнатуру метода для применения расширения eta. - PullRequest
1 голос
/ 08 мая 2019

Есть ли способ указать сигнатуру метода, к которому я хочу применить расширение eta ? Например:

val tupleNum = (1L,2L)

case class CaseClass(a:String, b:String)
object CaseClass {
  def apply(a: Long, b: Long): CaseClass = new CaseClass(s"${a}", s"${b}")
}

println( (CaseClass.apply _).tupled(tupleNum) )

Выдает ошибку компиляции:

Error:(9, 29) ambiguous reference to overloaded definition,
both method apply in object CaseClass of type (a: String, b: String)CaseClass
and  method apply in object CaseClass of type (a: Long, b: Long)CaseClass
match expected type ?
println( (CaseClass.apply _).tupled(tupleNum) )

Спасибо!

Кстати: это расширение правильный термин для использования _ ?

1 Ответ

3 голосов
/ 08 мая 2019
  • Если вы указываете сигнатуру, вам все равно нужно указать типы аргументов.
  • Если вы уже указываете типы аргументов, вы можете просто использовать вместо них обозначение-заполнитель.

Это здесь компилируется и работает очень хорошо (странный отступ, чтобы избежать режима :paste):

case class C(a: String, b: String); object C {
  def apply(a: Long, b: Long): C = C(s"$a", s"$b")
}

val t = (1L, 2L)
println((C.apply(_: Long, _: Long)).tupled(t))

или, скорее,

println((C(_: Long, _: Long)).tupled(t))
...