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

class Foo

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

上記のように、マニフェストは任意の型に対して暗黙的に存在するようです。

コンテキストがバインドされているため、これは、暗黙的なマニフェストがないタイプがいくつかあることを意味します-それらは何ですか?

4

2 に答える 2

3

マニフェストは、具象型がソース コードで最後に表示されるポイントから、型パラメーターを介してそれが必要な場所まで「運ぶ」必要があります。

しかし、すべてにマニフェストがあります。

于 2011-11-19T01:34:09.170 に答える
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]

しかし、なぜこれが私が知らない振る舞いなのか。

于 2011-11-18T23:52:43.283 に答える