Scala Array映射返回ArraySeq
发布时间:2020-12-16 18:15:41 所属栏目:安全 来源:网络整理
导读:为什么我的工厂方法下面没有类型参数? import org.junit.runner.RunWithimport org.scalatest.junit.JUnitRunnerimport org.scalatest.FunSuite@RunWith(classOf[JUnitRunner])class WhyScalaNeverWillMakeIt extends FunSuite { test("Array becomes Array
为什么我的工厂方法下面没有类型参数?
import org.junit.runner.RunWith import org.scalatest.junit.JUnitRunner import org.scalatest.FunSuite @RunWith(classOf[JUnitRunner]) class WhyScalaNeverWillMakeIt extends FunSuite { test("Array becomes ArraySeq when you least want it") { val arr = Array("A","B","C") def f: String => Dummy = new Dummy(_) val bucket = new Bucket[Dummy](arr.map(f)) // val bucket2 = Bucket[String,Dummy](arr,f) // val bucket3 = Bucket[Dummy](arr,f) val bucket4 = Bucket(arr,f) } class Bucket[T]( val arr: Array[T] ) {/* Loads of business logic */} object Bucket { // def apply[T,U](arr: Array[T],f:T=>U):Bucket[U] = new Bucket[U](arr.map( b => f(b) )) // def apply[T](arr: Array[String],f:String=>T):Bucket[T] = new Bucket[T](arr.map( b => f(b) )) def apply(arr: Array[String],f:String=>Dummy):Bucket[Dummy] = new Bucket[Dummy](arr.map(f)) } class Dummy(val name: String) } 如果我取消注释对象Bucket中的工厂方法,我得到: error: type mismatch; found : scala.collection.mutable.ArraySeq[T] required: Array[T] def apply[T](arr: Array[String],f:String=>T):Bucket[T] = new Bucket[T](arr.map( b => f(b) )) 当我介绍类型参数T时,不知何故Scala编译器感到困惑(或者是我?;-)).也许我在这里做了一些非常错误的事情,但我看不出为什么引入类型参数意味着地图函数应该将返回类型从Array [T]更改为ArraySeq [T]. 我知道Array只是Java Array的一个包装器,我可能应该使用一个更奇特的Scala类,比如Seq或List,但这仍然无法解释这种奇怪的行为. 有人可以解释为什么会发生这种情况,也许还有解决方法(仍在使用数组)? 编辑:我正在使用scala 2.9.1 解决方法
只需添加ClassManifest上下文绑定:
def apply[T,U: ClassManifest](arr: Array[T],f: T => U): Bucket[U] = new Bucket[U](arr.map(b => f(b))) def apply[T: ClassManifest](arr: Array[String],f: String => T): Bucket[T] = new Bucket[T](arr.map(b => f(b))) 有关详细信息,请查看this和this (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |