相关疑难解决方法(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万
查看次数

Map Scala中的不同类型

我需要一个Map,我在其中放入不同类型的值(Double,String,Int,...),key可以是String.

有没有办法做到这一点,以便我得到正确的类型与map.apply(k)喜欢

val map: Map[String, SomeType] = Map()
val d: Double = map.apply("double")
val str: String = map.apply("string")
Run Code Online (Sandbox Code Playgroud)

我已经尝试了泛型类型

class Container[T](element: T) {
    def get: T = element
}

val d: Container[Double] = new Container(4.0)
val str: Container[String] = new Container("string")
val m: Map[String, Container] = Map("double" -> d, "string" -> str)
Run Code Online (Sandbox Code Playgroud)

但是由于Container需要参数,所以不可能.这有什么解决方案吗?

generics scala shapeless

16
推荐指数
2
解决办法
1万
查看次数

Scala:HashMap可以为不同的键提供不同的数据类型吗?

我对Scala编程完全不熟悉,我有以下问题:

我需要一个HashMap,它可以包含许多数据类型(Int,String等).在C++中,我会使用BOOST的MultiMap.我听说在Scala中有一个MultiMap特征可用.基本上我想要的是以下内容:

val map = HashMap[String, ListBuffer[_]]
Run Code Online (Sandbox Code Playgroud)

ListBuffer元素的具体数据类型将在运行时确定.当我在控制台中测试此实现时,以下工作:

scala> val a = new HashMap[String, ListBuffer[_]]()
a: scala.collection.mutable.HashMap[String,scala.collection.mutable.ListBuffer[_]] = Map()

scala> val b = new ListBuffer[String]()
b: scala.collection.mutable.ListBuffer[String] = ListBuffer()

scala> val c = new ListBuffer[Int]()
c: scala.collection.mutable.ListBuffer[Int] = ListBuffer()

scala> b += "String"
res0: b.type = ListBuffer(String)

scala> c += 1
res1: c.type = ListBuffer(1)

scala> a += "String Buffer" -> b
res2: a.type = Map((String Buffer,ListBuffer(String)))

scala> a += "This is an Int Buffer" -> c
res3: a.type = …
Run Code Online (Sandbox Code Playgroud)

scala wildcard hashmap listbuffer

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