Scala生活中的一个可悲事实是,如果你实例化一个List [Int],你可以验证你的实例是一个List,你可以验证它的任何单个元素是一个Int,但不是它是一个List [ Int],可以很容易地验证:
scala> List(1,2,3) match {
| case l : List[String] => println("A list of strings?!")
| case _ => println("Ok")
| }
warning: there were unchecked warnings; re-run with -unchecked for details
A list of strings?!
Run Code Online (Sandbox Code Playgroud)
-unchecked选项将责任直接归咎于类型擦除:
scala> List(1,2,3) match {
| case l : List[String] => println("A list of strings?!")
| case _ => println("Ok")
| }
<console>:6: warning: non variable type-argument String in type pattern is unchecked since it is eliminated by erasure
case l …Run Code Online (Sandbox Code Playgroud) 可以说我有以下代码:
abstract class Animal
case class Dog(name:String) extends Animal
var foo:Animal = Dog("rover")
var bar:Dog = foo //ERROR!
Run Code Online (Sandbox Code Playgroud)
如何修复此代码的最后一行?基本上,我只想做一些类似C语言的事情:
var bar:Dog = (Dog) foo
Run Code Online (Sandbox Code Playgroud) 例如,想象您有以下内容:
import play.api.data._
import play.api.data.Forms._
case class TestDomainClass(text: String, number: Int, date: DateTime, long: Long, boolean: Boolean)
val testForm = Form(
mapping(
"textField" -> text,
"numberField" -> number,
"dateField" -> jodaDate,
"longField" -> longNumber,
"booleanField" -> boolean
)(TestDomainClass.apply)(TestDomainClass.unapply)
)
Run Code Online (Sandbox Code Playgroud)
我的目标是在每个字段的参数类型上进行模式匹配.例如:对于textField参数类型将是String,并且对于dateField将是org.joda.time.DateTime.
def typeOfMappingUsingTypeTag[T: TypeTag](m: Mapping[T]) = typeOf[T] match {
case t if t =:= typeOf[String] => println("type is String")
case t if t =:= typeOf[Int] => println("type is Int")
case t if …Run Code Online (Sandbox Code Playgroud) 我想写一个这样的函数:
def genericCase[T]() : PartialFunction[Any, T] = {
case Wrapper(_, item: T) => item
case Wrapper(item: T, _) => item
}
Run Code Online (Sandbox Code Playgroud)
总之,我想要一种方法来重用不同类型的模式匹配结构.
编译器告诉我,由于类型擦除,case x: T将永远不会匹配.做这种通用案例陈述的替代方法是什么?我还尝试在反射API中使用Types作为函数的参数,但我们无法弄清楚.