Manifest不可用时的情况

时间:2011-11-18 23:43:06

标签: arrays scala manifest context-bound

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

class Foo

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

对于任意类型,清单似乎隐含存在,如上所示。

由于我们有一个上下文绑定,这意味着会有一些类型没有隐式Manifest - 它们是什么?

2 个答案:

答案 0 :(得分:3)

Manifest必须从具体类型最后出现在源代码中的那一点“进行”,一直到类型参数到需要它的位置。

但是一切都有明显的。

答案 1 :(得分:2)

我不确定你的扣除是否正确。我没有看到没有清单的 types ,但是我看到了情境,其中类型推理器似乎无法提供。

特别是在这样的嵌套推理情况中:

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]

但是,为什么这是我不知道的行为。