Что касается первого вопроса:
1.Когда мы должны использовать тип параметра после имени функции, как этот имя_функции [T]
если вы хотите, чтобы эта функция использовалась по-разному, то стоит признать, что общий тип после имени функции равен funcName[T]
. Например, у вас есть функция, как этот
def myFunction[T](param1: T){/*process*/}
вы хотите передать параметр param1
и param2
к myFunction
. Эти два параметра определяются следующим образом
val param1: Int = 10
val param2: String = "test"
Хотя param1
и param2
имеют различные типы, вы можете вызвать функцию myFunction(param1)
, а также myFunction(param2)
Тогда давайте поговорим о втором вопросе
2 . Что означает t: => T?
Это by-name parameter
. что это? Ниже дает вам более подробную информацию:
t: => T
имеет такое же значение, как и t:() => T
, вместо inputing слова () => T
, вы можете выбрать => T
как для t
Другой пример: если вы хотите есть утверждение, вы можете определим функцию следующим образом:
def myAssert(predicate:() => Boolean) =
if(!predicate()) throw new AssertionError
, то вы можете использовать его следующим образом
myAssert(() => 5 > 3)
Использование настолько уродливое, не так ли? Вы можете использовать его как этот
myAssert(5 > 3)
в это время, by-name parameter
будет на сцене.Просто определите функцию помощи by-name parameter
def myAssert(predicate: => Boolean) = //leave out '()'
if(!predicate) throw new AssertionError //leave out '()'
то, вы можете использовать myAssert
, как указано выше
myAssert(5 > 3)
Примечания: Побочный имя типа, в котором пустой список параметров,() , опускается, разрешено только для параметров. Нет такой вещи, как переменная by-name или поле для имени.
Удачи вам.
(1) 'def compare [T] (num1: T, num2: T): Boolean ...' не является хорошим примером, если вы не хотите сравнивать хэш-коды, так как вы ничего не знаете о типе ' T'. Контейнеры - лучшие примеры без ограничений типа. (2) В первом 'def myAssert ...' вы должны писать 'if (! Predicate())', функции требуют явных скобок. –