Если SenderCollectorFsm
определен как обычный класс, например
class SenderCollectorFsm(...
тогда мы должны использовать new
, однако, если он был определен как case-класс, например
case class SenderCollectorFsm(...
тогда мы могли бы написать TestFSMRef(SenderCollectorFsm)
.
Однако в обоих случаях мы передаем значение , а не тип , как объяснил Йорг Миттаг. Хотя я могу видеть, как TestFSMRef(SenderCollectorFsm)
может выглядеть так, как будто мы передаем тип, это просто сокращение для передачи экземпляра класса case. Обратитесь к Почему «case case» не нуждается в «new» для создания нового объекта
Также обратите внимание, что T
не является подтипом ClassTag
, поскольку параметр параметра типа
T <: Actor : ClassTag
состоит из двух различных типов ограничений на T
T <: Actor
T : ClassTag
, где T <: Actor
действительно указывает T
- это подтип Actor
, однако T : ClassTag
указывает, что T
должен иметь неявный класс типов ClassTag[T]
в области видимости. Обратите внимание на разницу между типовыми ограничениями <:
и :
, где первая - это верхняя граница , а вторая - контекстная граница .