Укажите сигнатуру метода для применения расширения eta.
Есть ли способ указать сигнатуру метода, к которому я хочу применить расширение 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) )
Спасибо!
Кстати: это расширение eta правильный термин для использования _?
1 ответ
Решение
- Если вы указываете сигнатуру, вы все равно должны указать типы аргументов.
- Если вы уже указали типы аргументов, вы можете просто использовать вместо них обозначение-заполнитель.
Это здесь компилируется и работает просто отлично (странный отступ, чтобы избежать :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))