Из того, что я предполагаю, Foo [T1, T2] просто означает, что он определил два параметра типа, он не должен принимать T1
и возвращать T2
.
* 1005.*
Параметр типа означает не что иное, как «мне нужен любой тип, но мне не интересно знать, что это за конкретный тип», где «I» - программист, который пишет код.Параметры типа могут использоваться как любые другие типы, такие как Int, String или Complex - единственное отличие состоит в том, что они не известны, пока их не используют.
См. Тип Map[A, +B]
.Когда вы впервые прочитаете это, вы не сможете узнать, для чего предназначены A и B, поэтому вам нужно прочитать документацию:
Карта ключей типа A и значений типа B.
Объясняет типы и их значение.Больше нечего знать или понимать.Они просто два типа.Карту можно назвать чем-то вроде Map[Key, Value]
, но внутри исходного кода лучше, когда параметры типа имеют только одну или две буквы.Это облегчает различие между параметрами типа и конкретными типами.
Документация определяет, что означает параметр типа.И если нет документации, вы должны взглянуть на источники и найти их значение самостоятельно.Например, вы должны сделать это с Function2 [-T1, -T2, +R]
.Документация говорит нам только об этом:
Функция 2 параметров.
Хорошо, мы знаем, что два из трех параметров типа являются параметрами, которые ожидает функция, но чтотретий?Мы рассмотрим источники:
def apply (v1: T1, v2: T2): R
Ах, теперь мы знаем, что T1
и T2
являются параметрами, а R является возвращаемым типом.
Параметры типа также можно найти в сигнатурах методов, таких как map:
class List[+A] {
..
def map[B](f: (A) ⇒ B): List[B]
}
Вот как выглядит карта, когда вы ее используетесо списком.A
может быть любого типа - это тип элементов, содержащихся в списке.B
- другой произвольный тип.Когда вы знаете, что делает карта, тогда вы знаете, что делает B
.В противном случае вы должны понимать карту раньше.map ожидает функцию, которая может преобразовать каждый элемент списка в другой элемент.Поскольку вы знаете, что A
обозначает элементы Списка, которые вы можете извлечь из себя, B
должен быть типа A
, преобразуемого в.
Чтобы ответить на все другие ваши вопросы: Это не следуетне может быть сделано в одном ответе.В StackOverflow есть много других вопросов и ответов, которые также могут ответить на ваши вопросы.
Сводка
Когда вы видите некоторые параметры типа, например, в Foo[T1, T2]
, вы не должны плакать.Подумайте: «Хорошо, у меня есть Foo, который ожидает T1 и T2, и если я хочу знать, что они делают, я должен прочитать документацию или источники».