Ситуации, когда Манифест недоступен - PullRequest
6 голосов
/ 19 ноября 2011
def bar[T: Manifest](a: Array[T]) = Array.ofDim[T](3)

class Foo

bar(Array(new Foo))  //Array[Foo] = Array(null, null, null)

Манифесты существуют неявно для произвольных типов, как показано выше.

Поскольку у нас есть привязка к контексту, это подразумевает, что будут некоторые типы, для которых нет неявного манифеста - что это такое?

Ответы [ 2 ]

3 голосов
/ 19 ноября 2011

Манифест должен быть «перенесен» с точки, где конкретный тип последний раз появляется в исходном коде, через параметры типа до места, где он требуется.

Но у всего есть манифест.

2 голосов
/ 19 ноября 2011

Я не уверен, что ваш вывод правильный.Я не видел типов , для которых нет манифеста, но я видел ситуации , когда механизм вывода типов не может их предоставить.

Специальнов таких ситуациях логического вывода:

scala> def bar[T: Manifest](a: Array[T]) = Array.ofDim[T](3)
bar: [T](a: Array[T])(implicit evidence$1: Manifest[T])Array[T]

scala> def bar2[T](a: Array[T]) = bar(a)
<console>:8: error: No Manifest available for T.
   def bar2[T](a: Array[T]) = bar(a)
                                ^

Кажется, что если манифест «не передан», он недоступен на нижнем уровне - так что мы можем сказать

scala> def bar2[T: Manifest](a: Array[T]) = bar(a)
bar2: [T](a: Array[T])(implicit evidence$1: Manifest[T])Array[T]

или

scala> def bar2[T](a: Array[T])(implicit m: Manifest[T]) = bar(a)
bar2: [T](a: Array[T])(implicit m: Manifest[T])Array[T]

Впрочем, почему я так не знаю?

...