Лично я, вероятно, использовал бы кортежи, как упоминает herom в комментарии.
scala> ("a string", 10, (1), () => {})
res1: (java.lang.String, Int, Int, () => Unit) = (a string,10,1,<function0>)
Но вы не можете легко присоединиться к таким структурам.
HList, упомянутый ePharaoh, «создан для этого», но я бы, вероятно, остался в стороне от него. Это тяжело на программировании типов и, следовательно, может нести неожиданную нагрузку (то есть создавать много классов при компиляции). Просто будь осторожен. HList из вышеперечисленного (нужна библиотека MetaScala) будет (не доказано, так как я не использую MetaScala):
scala> "a string" :: 10 :: (1) :: () => {} :: HNil
Вы можете добавить и т. Д. (Ну, по крайней мере, добавить) к такому списку, и он будет знать типы. Prepending создает новый тип со старым типом в качестве хвоста.
Тогда есть еще один подход, который еще не упомянут. Классы (особенно тематические) очень легки в Scala, и вы можете сделать их как однострочные:
scala> case class MyThing( str: String, int: Int, x: Int, f: () => Unit )
defined class MyThing
scala> MyThing( "a string", 10, 1, ()=>{} )
res2: MyThing = MyThing(a string,10,1,<function0>)
Конечно, это также не повлияет на добавление.