Ситуации, когда Манифест недоступен

def bar[T: Manifest](a: Array[T]) = Array.ofDim[T](3)

class Foo

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

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

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

2 ответа

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

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

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

В частности, в таких ситуациях, как вывод:

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]

Однако, почему я так не знаю.

Другие вопросы по тегам