2017-08-19 12 views
3

私は、次のScalaのソースコードをコンパイルして実行してみました:ScalaのArrayとArray [Type]の違いは何ですか?

class People(val name: String) 
class Student(studentName: String) extends People(studentName) 

def getNames(array: Array[People]) = { array.map(_.name) } 

getNames(Array[Student](new Student("Mike"), new Student("Tom"))) 

私はエラーメッセージました:予想通りアレイ[学生]配列のサブタイプではないので、それは[ピープル]です

Name: Compile Error 
Message: <console>:30: error: type mismatch; 
found : Array[Student] 
required: Array[People] 
Note: Student <: People, but class Array is invariant in type T. 
You may wish to investigate a wildcard type such as `_ <: People`. (SLS 3.2.10) 
     getNames(Array[Student](new Student("Mike"), new Student("Tom"))) 

を。

は、それから私は、エラーが消えていた

getNames(Array(new Student("Mike"), new Student("Tom"))) 

getNames(Array[Student](new Student("Mike"), new Student("Tom"))) 

を更新しました。だから私はScalaでArrayとArray [型]の違いは何か、特にメソッドのパラメータとして渡されたときにはどうかと思っています。

ありがとうございます!

答えて

1

これは、Scala配列がJavaのcovariance mistakeを繰り返さないためです。 Javaでは、次の操作を行うことができます。

Student[] students = new Student[10]; 
Person[] people = students; // ok in Java arrays are covariant 
people[1] = new Person(); // RuntimeException in Java!! 

Scalaはこれよりも安全です(Javaジェネリックコレクションなど)。

型の安全性を高めるには、常に特定のバージョンのコレクションを使用する必要があります。 Arrayの例では、関数呼び出しの汎用パラメータ()が検出されています。

+0

お返事ありがとうございました。 – ihainan

+0

申し訳ありませんが、この回答の2番目の部分は間違っています。 "非汎用"配列を取得していない場合、期待される型の型は 'getNames'メソッドによって提供されるため、' Array [People] 'を取得しています。 –

関連する問題