Scala uppmuntrar visserligen till en funktionell programmeringsstil, men stödjer också objektorientering bättre än Java

Medan språket Java använder sig av ett antal primitiva typer (t.ex. "int") utan några metoder, så är allt objekt i Scala, t.ex. om man adderar två tal så är plus-"operatorn" faktiskt en metod som blir anropad. Följande Scala-kod:
val sum = 1 + 2
kommer alltså att trigga att metoden + blir anropad, och genom att använda parenteser runt omkring heltalen (av typen Int) så kommer alltså ovanstående kod att motsvara följande objektorienterade metodanrop (där punkten används för att skilja objekt och metoder, på samma sätt som i Java):
(1).+(2)

Ett annat exempel är metoderna för absolut-beloppet och att räkna fram max-värdet av två heltal. De metoderna finns i Java's klass Math, och kan då i Java användas på följande sätt som inte är objektorienterat:

Integer integer_1 = ...
Integer integer_2 = ...
Integer maxAbsoluteValue = Math.max(Math.abs(integer_1), Math.abs(integer_2));
// alternativt, om du använder en Static import av Math-metoderna:
Integer maxAbsoluteValue = max(abs(integer_1), abs(integer_2));
		

När man använder Scala kan man däremot välja att anropa sådana metoder direkt på Int-klassen i stället, dvs så här:

val maxAbsoluteValue = Math.max(integer_1.abs, integer_2.abs)
// alternativt (om man tycker det blir mer läsligt) med ännu mer objektorienterad kod:
val maxAbsoluteValue = integer_1.abs.max(integer_2.abs)
		

Angående den ovanstående Java-programmeringsstilen med procedur-orienterade anrop på Java's static-metoder (t.ex. Math.max och Math.abs) så blir man tvingad till det i Java när man egentligen hellre skulle vilja utöka t.ex. klassen String med metoder man tycker borde finnas där.

I sådana situationer brukar det i många java-projekt skapas 'utility-klasser', t.ex. en StringUtility-klass med en massa static-metoder som tar emot en sträng som parameter, eftersom det saknas funktioner i språket Java för att implementera något som liknar Extension methods i C#.NET. Exempelvis det populära ramverket Spring Framework har just en sådan klass som heter StringUtils. Ett annat exempel är Apache-projeket Commons Lang som också har en klass StringUtils.

Med Scala däremot så finns det möjlighet att använda s.k. implicita konverteringar som gör att man kan skriva Scala-kod som ger ett mer objektorienterat API där det ser ut som att man anropar metoder på existerande klasser men som egentligen inte finns där.
Mer information, och kodexempel, för implicita konverteringar i Scala

/ Tomas Johansson, 2010-01-19