Another Tour of Scala

ScalaGenerics

The Gist

Generic Classes and Compound Classes give an overview of one (unfortunately small) aspect of Scala’s support for generics.

My Interpretation

Scala, like Java, has support for generics, or parameterized types. In the simplest case, it works more or less like Java, with a slightly different syntax (and a more concise means of use, thanks to Scala’s type inference).

Suppose you wish to create a configuration system that maps keys to values, but that you want the values to be typed.

(Symbols in Scala are fixed values created via a single quote. This is essentially the same concept as a :symbol in Ruby)

This is pretty much what you’d get from Java, however it’s important to note that each of the four values we created are all typed, and each call to .value returns a typed object that can be checked at runtime. If you were to try:

new Connector(desc.value,attempts.value,url.value,failonerror.value)

you would get a compile error.

Also note that, like in Java, if a class Child extends a class Parent, Configuration[Child] is not a subclass of Configuration[Parent] (although you can change this behavior ).

Generic Methods

Methods can also be genericized, as they can be in Java:

def doit[T](thing: T):String = thing.toString

Compound Types

Since Scala allows for multiple inheritance, the question arises: how do you specify that a type conforms to multiple classes? If you wish to accept all Entity classes that implement Serializable, you can say [Entity with Serializable].

My Thoughts on this Feature

This is where static typing really starts to take a turn for the confusing. While generics as described here are pretty straightforward, it opens a rabbit hole of potential confusion. That being said, this is really necessary to avoid gobs of casting and other nastiness that would be required otherwise. If I’m doing Java or Scala, I’d rather have it than not.