我不明白为什么在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}
}
}
你能给我一些解释或很好的链接来理解这些问题吗?
答案 0 :(得分:3)
但是,由于您的函数必须能够使用任何T
(任何数组类型),因此它始终会返回Array[(String,Array[Double])]
。
更简单的工作签名是:
def getColumns[T](): Array[(String,Array[T])]
但是在函数体中,您必须创建一个类型为T
的数组。
答案 1 :(得分:0)
您的函数签名在复合返回类型中需要T
,但您可以为其指定Array[Double]
。请注意T <: Array[Double]
,而不是相反。以下代码有效:
def getColumns[T >: Array[Double]] ():Array[(String,T)] ={
Array(Tuple2("test",Array(1.0,2.0,3.0)))
}
不应该是你想要的,只是为了解决问题。