Ситуации, когда Манифест недоступен
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]
Однако, почему я так не знаю.