А давай вернемся к этому листу, раз уж ты в курсе за фантомные типы. Отличный кейс. Ты случайно не знаешь чем обусловлено наличие отдельного класса-враппера для него? Все отличие от обычного листа просто в гарантированном head & tail. Почему бы действительно не забацать компаньон с проверкой?
newtype NonEmptyList[T]
object NonEmptyList {
def one[T](v:T):NonEmptyList[T] = newtyped List(v)
def fromList[A](l: List[A]): Option[NonEmptyList[A]]
... все опсы прячем в опсы к ньютайпу ...
}
разве этот ньютайп с компаньоном не будет лучше? или религия не позволяет, потому что это как ты говоришь - java-way какой-то?