具有特征和具体类的scala返回类型

时间:2017-10-13 04:27:47

标签: scala vector

我有一个scala对象,如下所示,当我在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]是特征。

下面是Vector

的def
 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]] 

然后为什么要抱怨?

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
  }

}

类型不匹配; found:scala.collection.immutable.IndexedSeq [Int] required:Vector [Int]

1 个答案:

答案 0 :(得分:3)

可以将Vector分配给引用定义的IndexedSeq类型(因为Vector实现了IndexedSeq特征),但是不能将IndexedSeq分配给被定义为类型Vector的引用,这是您正在尝试执行的操作< / p>

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]的引用,但编译器无法证明该行不会失败。