两个字符串,相同的类型,一个具有" toInt"方法,另一方面没有

时间:2014-10-03 13:49:23

标签: scala

我有以下代码:

val nodePortString: scala.Predef.String = List.fromArray(args, 0, args.length).toList.headOption.getOrElse(throw new IllegalArgumentException())
val a: scala.Predef.String = "1234" 
val b = a.toInt
val nodePort = nodePortString.toInt

我甚至添加了带包的显式类型。从最后一行抛出错误:

[error] /Users/amorfis/idea-workspace/akka-journal-stress/src/main/scala/core/core.scala:29: value toInt is not a member of String
[error]   val nodePort = nodePortString.toInt
[error]                                 ^

地球上怎么可能,我有2个字符串,类型完全相同,其中一个有“toInt”方法,而另一个没有?

它在Scala 2.10.4上

2 个答案:

答案 0 :(得分:3)

scala.Predef.Stringjava.lang.String的别名,它没有toInt方法。

它通常工作的原因是String被隐式转换为StringOps,它为java类型提供了所有scala细节。

由于某种原因隐式不触发,我的假设是使用fromArray(已弃用)方法会混淆类型(数组是有趣的野兽,因为java兼容性)

您可以尝试使用

val nodePortString = args.toList.headOption.getOrElse(throw new IllegalArgumentException())

代替?


更新

我在scala 2.10.4上进行了测试,它为我编译,这是一个REPL会话:

Welcome to Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_20).
Type in expressions to have them evaluated.
Type :help for more information.

scala> object Main extends App {
     |   override def main(args: Array[String]) = {
     |     val nodePortString: scala.Predef.String = List.fromArray(args, 0, args.length).toList.headOption.getOrElse(throw new IllegalArgumentException())
     |     val nodePort = nodePortString.toInt
     |   }
     | }
warning: there were 1 deprecation warning(s); re-run with -deprecation for details
defined module Main

我假设argsmain App方法的参数,但只要它是Array[String]就不会有所作为。那是你的实际代码吗?你能展示一个可重复的自包含示例吗?

答案 1 :(得分:0)

您确定nodePortString具有相同的值吗? 方法。来自StringLike e的方法通过隐式转换向我们显示。

args的价值是什么?!

我在这里试过val args = Array(“1”,“2”,“3”,“4”)并得到nodePort:Int = 1 ...

工作正常,但你必须确定......