我有以下代码:
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上
答案 0 :(得分:3)
scala.Predef.String
是java.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
我假设args
是main
App
方法的参数,但只要它是Array[String]
就不会有所作为。那是你的实际代码吗?你能展示一个可重复的自包含示例吗?
答案 1 :(得分:0)
您确定nodePortString具有相同的值吗? 方法。来自StringLike e的方法通过隐式转换向我们显示。
args的价值是什么?!
我在这里试过val args = Array(“1”,“2”,“3”,“4”)并得到nodePort:Int = 1 ...
工作正常,但你必须确定......