Main.scala:
package controler
object Main {
def main(args: Array[String]) {
import Utilites._
isJavaUpToDate
}
}
Utilites.scala:
package controler
object Utilities {
def isJavaUpToDate = {
val javaVersion = augmentString(System.getProperty("java.version").substring(2, 3))
javaVersion >= 6
}
}
为什么这不起作用? 我已经做了很多不同的教程网站,这没什么问题。
我总是说无法找到val Utilites。
P.S。为什么它只是在破坏代码时使用augmentString()来改变.toInt?
现在这给了我麻烦,一些关于隐式排序和方法orderTOOrdered。
答案 0 :(得分:5)
在main
方法中,您输入了Utilites
,您打算键入Utilities
。
Correct: Utilities
Wrong: Utilites
注意缺少i
:)并且因为你的大脑是一个强大的拼写纠正工具,它假装拼写是正确的。但是,Scala编译器并不那么酷;)
另外,对我来说,以下内容不起作用:
scala> augmentString(System.getProperty("java.version").substring(2, 3)) >= 5
<console>:15: error: No implicit Ordering defined for AnyVal.
augmentString(System.getProperty("java.version").substring(2, 3)) >= 5
相反,我用
替换它System.getProperty("java.version").substring(2, 3)).toInt >= 5
您在使用前代码时遇到的隐式排序问题是因为Scala不知道如何将>=
方法/运算符应用于scala.collection.immutable.StringOps
返回的augmentString()
类型。
答案 1 :(得分:2)
请注意,通过调用augmentString
,您明确将字符串转换为StringOps。
StringOps确实定义了一个>=
方法,但它的意思是比较字符串(它的签名是def >=(that: String): Boolean
)
如果您想比较Ints,您应该使用toInt
中定义的StringOps
方法。
def isJavaUpToDate = {
val javaVersion = augmentString(System.getProperty("java.version").substring(2, 3)).toInt
javaVersion >= 6
}
此外,除非您需要消除toInt
与您定义的另一个隐式(或在您正在使用的库中的其他位置定义)的歧义,否则不需要显式调用augmentString。以下应该正常工作(除非编译器告诉你它没有),它应该隐含地具有与上述代码相同的效果,即将String
转换为StringOps
。
def isJavaUpToDate = {
val javaVersion = System.getProperty("java.version").substring(2, 3)
javaVersion.toInt >= 6
}
编辑:根据@ som-snytt的评论
你得到的错误(No implicit Ordering defined for AnyVal
)是由于编译器的推理或多或少是这样的:
javaVersion >= 6
表示javaVersion.>=(6)
,即我必须在javaVersion上查找一个名为>=
的方法,该方法采用整数javaVersion
是一个StringOps
... StringOps中有一个>=
方法(由它所扩展的StringLike
特征提供,反过来扩展Ordered[String]
但它需要一个String参数,而不是一个Int Ordering
提供合适的StringOps
。现在,既然您正在尝试将String
与Int
进行比较,那么您正在查看Ordering
,它可以将两个值与可以包含{{1}的最近共同祖先进行比较}和String
,即Int
[编辑:虽然String是一个AnyRef所以我真的没有得到这个部分......]。 AnyVal
s