【问题标题】:Scala generic arrays instantiatingScala 泛型数组实例化
【发布时间】:2014-10-23 16:48:29
【问题描述】:

我有一个函数可以生成特定类型的数组:

def mkArray[A:ClassTag:Ordering](size:Int):Array[A] = Array.ofDim[A](size)

我想根据 String str 制作 Int 或 String 类型的数组 arr,如下所示:

var arr = if(str=="i"){mkArray[Int](size)}else{mkArray[String](size)}

现在我尝试像这样向数组添加值:

arr(n) = num.toInt // num is String like "123"

但它说:

- type mismatch; found : Int required: _366 where type _366 >: Int 
 with String

如何解决这个问题,根据字符串 str 制作 Array[Int] 或 Array[String] 类型的 arr?

任何帮助表示赞赏, 谢谢!

【问题讨论】:

  • 您直接使用mkArray[Int],而不是使用str 和值"i" 等。尝试对编译器更明确。

标签: arrays scala generics type-mismatch


【解决方案1】:

Scala 是一种静态类型语言,在您的情况下,arr 的类型是Array[_ >: Int with String]。因此,如果你给它一个 Int,你会得到一个类型错误。

根据您在代码中进一步使用数组的方式,我建议您查看 Either[1],因为它可能有助于保留 Array[Either],并使用模式匹配对其进行处理当它包含 Int 与 String 时有所不同。

[1]http://danielwestheide.com/blog/2013/01/02/the-neophytes-guide-to-scala-part-7-the-either-type.html

【讨论】:

  • 感谢您的回答。 Array 旨在用作排序算法的输入,并且速度非常重要(它是一个学校项目),所以我认为直接比较 Int 或 String 会比使用这种 Either 类型快得多。我已经实现了我自己的值包装类,它可以包含字符串或整数,但对于这个分配来说速度不够快。那么有什么办法可以让我直接比较 Ints 或 Strings 吗?
  • 在不知道确切代码的情况下很难优化,但最好保留两个数组,一个用于整数,一个用于字符串。
猜你喜欢
  • 1970-01-01
  • 2016-06-08
  • 2013-10-03
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
相关资源
最近更新 更多