I wish they had gone with inline class
instead of the weird opaque type
syntax.
inline class MyString(self: String) { def greet = s"hello $self" }
First, it would generally require less boilerplate, and second, it makes more sense conceptually with respect to companion objects: types cannot have companion objects, but classes can. The fact that opaque types are an exception and can have companion objects is fairly ugly.
For the first point, compare:
implicit inline class MyString(self: String) { def greet = s"hello $self" }
With:
opaque type MyString = String
object MyString {
implicit def apply(self: String): MyString = self
implied MyStringOps {
def (self: MyString) greet = s"hello $self"
}
}