2

このコードが Scala で不可能な理由がわかりません:

  def getColumns[T <: Array[_]] ():Array[(String,T)] ={
     Array(Tuple2("test",Array(1.0,2.0,3.0)))
  }

コンパイラは次のように述べています。

タイプ Array[(String,Array[Double])] の式は、予期されるタイプ Array[(String, T)] に準拠していません

私はこのコードで同じエラーがあります:

 def getColumns[T <: Array[Double]] ():Array[(String,T)] ={
     Array(Tuple2("test",Array(1.0,2.0,3.0)))
  }

私の完全なユースケースでより明確になり、最終的に次を選択しましたArray[AnyVal]

class SystemError(message: String, nestedException: Throwable) extends Exception(message, nestedException) {
  def this() = this("", null)
  def this(message: String) = this(message, null)
  def this(nestedException : Throwable) = this("", nestedException)
}

class FileDataSource(path:String) {
   val fileCatch = catching(classOf[FileNotFoundException], classOf[IOException]).withApply(e => throw new SystemError(e))

   def getStream():Option[BufferedSource]={
     fileCatch.opt{Source.fromInputStream(getClass.getResourceAsStream(path))}
   }
}

class CSVReader(src:FileDataSource) {

  def lines= src.getStream().get
  val head = lines.getLines.take(1).toList(0).split(",")
  val otherLines = lines.getLines.drop(1).toList

  def getColumns():Array[(String,Array[_])] ={
    val transposeLines = otherLines.map { l => l.split(",").map {
      d => d match {
        case String => d
        case Int => d.toInt
        case Double => d.toDouble
      }}.transpose }

    head zip transposeLines.map {_.toArray}
  }
}

問題を理解するための説明や良いリンクを教えてください。

4

2 に答える 2

3

ただし、関数は任意の (任意の配列型) で動作できる必要があるため、T常にArray[(String,Array[Double])].

より単純な署名は次のようになります。

def getColumns[T](): Array[(String,Array[T])]

ただし、関数の本体では、 type の配列を作成する必要がありますT

于 2012-12-07T16:28:59.593 に答える
0

関数の署名にはT、複合戻り値の型で a が必要ですが、 を指定しますArray[Double]。その逆ではないことに注意してくださいT <: Array[Double]。次のコードが機能します。

def getColumns[T >: Array[Double]] ():Array[(String,T)] ={
 Array(Tuple2("test",Array(1.0,2.0,3.0)))
}

あなたが望むものであってはなりませんが、問題を詳しく説明するためだけです。

于 2012-12-07T16:53:16.230 に答える