相关疑难解决方法(0)

如何在Scala上绕过类型擦除?或者,为什么我不能获得我的集合的类型参数?

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)

scala type-erasure

366
推荐指数
7
解决办法
7万
查看次数

Scala中的显式类型转换

可以说我有以下代码:

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)

scala type-conversion

75
推荐指数
1
解决办法
7万
查看次数

在映射上的模式匹配

例如,想象您有以下内容:

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)

scala playframework-2.0

6
推荐指数
1
解决办法
240
查看次数

如何编写一个使用泛型类型执行case语句的函数?

我想写一个这样的函数:

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作为函数的参数,但我们无法弄清楚.

scala

5
推荐指数
1
解决办法
267
查看次数