Простой вопрос о дженериках Scala - PullRequest
4 голосов
/ 18 марта 2011

В чем разница между X[Any] и X[_]?

Давайте рассмотрим, например, две функции ниже:

def foo(x:X[_]){}
def foo(x:X[Any]){}

В чем именно разница между этими декларациями выше?

Ответы [ 2 ]

9 голосов
/ 18 марта 2011

Первый тип является экзистенциальным, а второй - нормальным типом. Первый синтаксис на самом деле означает это:

def foo(x:X[t] forSome { type t }){}

Это означает, что x имеет тип X[t], где t может быть любым неопределенным type t.

Интуитивно, X[_] означает, что параметр типа X не имеет значения, тогда как X[Any] говорит, что это должно быть Any.

0 голосов
/ 18 марта 2011

Разница в незначительной

scala> class X[T]   
defined class X

scala> def type_of[T](x: X[T])(implicit m: Manifest[T]) = m.toString
type_of: [T](x: X[T])(implicit m: Manifest[T])java.lang.String

scala> val x1: X[Any] = new X
x1: X[Any] = X@1a40cfc

scala> val x2: X[_] = new X  
x2: X[_] = X@29d838

scala> type_of(x1)
res10: java.lang.String = Any

scala> type_of(x2)
res11: java.lang.String = _ <: Any

Я не могу назвать ситуацию, когда вы можете использовать любую, но не можете использовать _ и наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...