Могу ли я переопределить метод `apply` сопутствующего объекта из черты Scala? - PullRequest
0 голосов
/ 06 декабря 2018

Я хочу ограничить создание класса Scala для использования конструктора объекта-компаньона:

case class Foo private (bar: String, baz: Int)

Теперь я не могу использовать ключевое слово new;Я могу создать только foo вроде Foo("catch", 22).Но скажем, я хочу подключиться к методу apply при создании объекта, чтобы обеспечить некоторые дополнительные функциональные возможности при создании экземпляра.Могу ли я сделать это в признаке?

object Foo extends SpecialApply[Foo]

trait SpecialApply[C] {
  override def apply(args: ???) = ???
}

Основная проблема заключается в том, что мне кажется, что я не знаю типы аргументов конструктора (String и Int) в признаке.Я мог бы передать их как кортеж, скажем, так:

object Foo extends SpecialApply[(String, Int), Foo]

trait SpecialApply[A, C] {
  override def apply(args: ???) = <companion object>
}

Или я мог бы получить их по отражению.В любом случае, я не уверен, как определить метод apply для кортежа.

Существует ли какая-либо комбинация отражения, .tupled функций, макроса и / или бесформенного магия, которая сделает эту работу?

...