Scala jest to wieloparadygmatowy język programowania wysokiego poziomu.
Scala jest językiem obiektowym w czystym tego słowa znaczeniu - w Scali wszystko jest obiektem. Typy danych i zachowania obiektów opisane są przez klasy i cechy. Po klasach abstrakcyjnych dziedziczą podklasy, a problem wielodziedziczenia rozwiązuje mechanizm oparty na domieszkach.
Cecha - pojęcie używane w programowaniu obiektowym, reprezentujące zbiór metod, których można użyć do rozszerzenia funkcjonalności klasy. Cechy w Scali są poniekąd odpowiednikiem interfejsów w Javie.
Domieszka - klasa, która umożliwia korzystanie z jej metod w innych klasach bez konieczności dziedziczenia z niej. Nie można utworzyć obiektu domieszki. Klasa może pozyskiwać dodatkowe funkcjonalności korzystając z wielu domieszek.
Scala łączy w sobie funkcyjność i obiektowość oraz zapewnia wiele mechanizmów i elementów charakterystycznych dla języków funkcyjnych. Przykładowe cechy Scali nadające językowi charakter funkcyjny:
W Scali podstawowym mechanizmem wspierającym wielowątkowość jest mechanizm Aktorów - wielowątkowych procesów, które komunikują się poprzez wymianę wiadomości. Aktora można traktować jako aktywny obiekt, w którym wywołanie odpowiedniej metody odpowiada wysłaniu wiadomości. W Scali biblioteka Actors zapewnia zarówno asynchroniczne, jak i synchroniczne przesyłanie wiadomości. Co więcej, Aktorzy mogą komunikować się z wykorzystaniem Future - mechanizmu, gdzie żądania są obsługiwane asynchronicznie, ale zwracają reprezentację, która pozwala poczekać na odpowiedź.
Scala działa na Wirtualnej Maszynie Javy (JVM) i jest kompatybilna z programami napisanymi w Javie. Aplikacje przeznaczone na Androida zazwyczaj pisane są w Javie i tłumaczone z kodu bajtowego Javy. Dzięki kompatybilności z Javą, Scala dobrze sprawdza się przy tworzeniu aplikacji mobilnych na Androida (szczególnie stosując podejście funkcyjne).
object abstractTypes extends Application {
abstract class Buffer {
type T; val element: T
}
abstract class SeqBuffer {
type T; val element: Seq[T]; def length = element.length
}
def newIntBuffer(el: Int) = new Buffer {
type T = Int; val element = el
}
def newIntBuffer(el: Int*) = new SeqBuffer {
type T = Int; val element = el
}
println(newIntBuffer(1).element)
println(newIntBuffer(1, 2, 3).length)
}
Źródło: www.scala-lang.org/old/node/222