2011-05-21 7 views
8

これは動作しません:ジェネリック型の配列を作成できないのはなぜですか?

def giveArray[T](elem:T):Array[T] = { 
    new Array[T](1) 
    } 

しかし、この処理が行われます。

def giveList[T](elem:T):List[T] = { 
    List.empty[T] 
    } 

私はこれはかなり基本的なものであると確信していると私は配列はScalaで少し珍しい振る舞うことができることを知っています。

誰かが私にこのような配列を作成する方法を教えてもらうことができますか、そしてなぜそれが最初に機能しないのでしょうか?

答えて

17

これは、JVMタイプの消去によるものです。この上

def giveArray[T: Manifest](elem:T):Array[T] = { 
    new Array[T](1) 
} 

ほとんどあり重複している質問:マニフェストは、彼らがタイプ情報がこれがコンパイルされます型Tに取り付けられるようになり、これを処理するために導入しました。私が掘ることができるかどうか見てみましょう。 詳細については、http://www.scala-lang.org/docu/files/collections-api/collections_38.htmlを参照してください。私はここに必要なのは何(あなたのケースでのelemにevenElemsを置き換える)

引用することは、evenElemsの実際の型パラメータが特に

が何であるかを、いくつかの実行時のヒントを提供することで、コンパイラを助けるということですClassManifestを使用することもできます。

def giveArray[T: ClassManifest](elem:T):Array[T] = { 
    new Array[T](1) 
} 

同様の質問:

+0

私はそれが前に何度も頼まれたと仮定が、私は何かを見つけることができませんでした。もう一度お返事いただきありがとうございます:) –

+0

ああ私は前にこれに答えたことはありません。私は同じ質問をしばらく前に聞いた:)私はあなたが "スカラ"とエラーメッセージで検索した場合、あなたは最終的にそれに遭遇しただろうと思う。 – huynhjl

+3

より正確に言えば、これは 'T 'は消去されますが、配列はありません。また、「ClassManifest」は高速です。 –

関連する問題