2017-10-13 4 views
1

私は、REPLにベクトルを表示するvecステートメントだけをREPLに入力すると動作する以下のようなスカラオブジェクトを持っていました。しかし、もし私が戻り値の型Vector [Int]のメソッドdef randomNumbersを使用すると、コンパイルエラーが発生するのはなぜですか?特徴とコンクリートクラスを持つスカラリターンタイプ

val vec = for (i <- 0 to 100) yield ((r.nextInt(100 - 10) + 1) + 10) 

scala.collection.immutable.IndexedSeq[Int] = Vector(38, 2....... 

これまでのところ、Vectorは適切な型であり、IndexedSeq [Int]は特長です。

以下

ベクタ

final class Vector[+A] extends AbstractSeq[A] with IndexedSeq[A] with GenericTraversableTemplate[A, Vector] with IndexedSeqLike[A, Vector[A]] with VectorPointer[A] with Serializable with CustomParallelizable[A, ParVector[A]] 

ためのDEFで、なぜそれが文句を言う必要がありますか?

object Random extends App { 

    def randomNumbers: IndexedSeq[Int] = { 
    val r = scala.util.Random 
    val vec = for (i <- 0 to 100) yield ((r.nextInt(100 - 10) + 1) + 10) 
    return vec 
    } 

} 

はエラー与える:

object Basics extends App { 

    def randomNumbers: Vector[Int] = { 
    val r = scala.util.Random 
    println(r.nextInt * 0.1 + 0.1) 
    println(r.nextFloat) 
    println(r.nextDouble) 
    println(r.nextInt) 
    println(r.nextPrintableChar) 
    val vec = for (i <- 0 to 100) yield ((r.nextInt(100 - 10) + 1) + 10) 
    return vec 
    } 

} 

型の不一致が。 (ベクトルがIndexedSeq特性を実装するため)IndexedSeqを定義することができますが、IndexedSeqを割り当てることができません(indexedSeqの特性を実装しているため)scala.collection.immutable.IndexedSeq [Int] required:Vector [Int]

答えて

3

あなたがしようとしているタイプのベクターとして定義されている参照へ

val vec = for (i <- 0 to 100) yield ((r.nextInt(100 - 10) + 1) + 10) 
vec: scala.collection.immutable.IndexedSeq[Int] = ... 

あなたは安全でないキャストを行うことができます。

vec.asInstanceOf[Vector[Int]] 

は、Vector [INT]の参照にこれを強制するには、コンパイラは、その行が失敗しないことを証明することはできません。

関連する問題