2017-10-13 68 views
1

我有一個scala對象,如下所示,當我輸入REPL時,它只是在vec語句中顯示REPL中的向量。但是,如果我使用方法def randomNumbers的返回類型Vector [Int],它會給出編譯錯誤爲什麼?具有特性和具體類的scala返回類型

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

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

據我明白矢量是正確的類型和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 
    } 

} 

類型不匹配;找到:scala.collection.immutable.IndexedSeq [Int]需要:Vector [Int]

回答

3

向量可以被分配給一個引用定義類型的IndexedSeq(因爲Vector實現了IndexedSeq trait),但是IndexedSeq不能被賦值以引用定義爲一種載體,它是你正在試圖做

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]的引用,但編譯器無法證明該行不會失敗。

相關問題