scalainterfacetraits

Trying to understand Scala trait


I am new to Scala. I don't understand Scala traits properly. I have read it is similar to Java interfaces but the methods need not be abstract. But how can I declare a Scala trait and instantiate it in the following code. The following code is working fine.

trait fooable {
    def foo: Unit = {
        println("This is foo")
    }
}

object Main {
    def main(args: Array[String]): Unit = {
        println("This is morking")
        val foo = new fooable{}
        foo.foo
    }
}

Output:

This is morking
This is foo

Solution

  • Scala traits are more general than both Java interfaces and abstract classes.

    You can use a trait as an interface, you can use it to store some implementation, you can use it simply to define a common super-type:

    trait Message
    case class Text(text: String) extends Message
    case class Data(data: ByteString) extends Message
    

    Multiple traits can be 'mixed in' a class:

    class MyClass extends TraitA with TraitB with TraitC
    

    where any conflict with identically named methods is resolved by the simple rule: the last trait takes precedence. This code:

    trait TraitA { def print() { println("A") } }
    trait TraitB { def print() { println("B") } }
    trait TraitC { def print() { println("C") } }
    new MyClass.print()
    

    will print "C".

    Scala traits can't be instantiated. You are creating an anonymous class in you example. If you add an abstract method to your trait it will not compile.

    Unrelated note: It is a good practice to write braces "()" in methods with side effects. Your method foo has a side effect: it prints something. So you should write "foo()".