Я хочу ограничить создание класса 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
функций, макроса и / или бесформенного магия, которая сделает эту работу?