Универсальные типы позволяют вам определять класс с типом заполнителя, который указывается при создании экземпляра объекта. Компилятор счастлив, потому что он может убедиться, что все безопасно для типов, и вы счастливы, потому что вы можете создать экземпляр объекта и передать произвольные типы для значения.
Чтобы использовать универсальный тип с вашим классом, вы можете изменить его следующим образом:
class CodeRunner[T] (val user_defined: (T) => Unit) {
def run(input: T) = {
user_defined(input)
}
}
[T] после «class CodeRunner» является важной частью - оно определяет, что существует универсальный тип T (вы можете заменить T другой заглавной буквой и т. Д.), Который будет использоваться в определении класса.
Итак, если вы определите метод:
def arbitrary_code(input: String) = { println("Running with input " + input) }
и затем передайте это:
val d1 = new CodeRunner(arbitrary_code)
... тогда компилятор говорит: «Ага, для этого экземпляра CodeRunner универсальный тип T является строкой». И если вы вызываете
d1.run("string")
компилятор будет счастлив, но не позволит вам перейти в d1.run (4).