Когда использовать экзистенциальный тип в Scala?

#scala

#scala

Вопрос:

Укажите следующее для методов:

 def beCool[T <: S](args:Array[T]) = {}
def beCool(args:Array[T forSome {type T <:S}]) = {}
  

Эквивалентны ли они? Можете ли вы привести мне несколько примеров, когда следует предпочесть какой?

Комментарии:

1. scalada.blogspot.com/2008/01/existential-types.html

Ответ №1:

Я думаю, вам понадобится первый, когда вам понадобится доступ к T . Самый простой пример — возврат элемента args:

 def beCool(args: Array[T forSome { type T }]): T = args.head // --> not found: type T
def beCool[T](args: Array[T]): T = args.head // ok
  

отсутствие доступного типа T в первом становится более очевидным, когда вы используете подстановочный знак:

 def beCool(args: Array[_ <: S]) = ???