java有线scala类型设计
我的环境是:
Scala版本2.9.1。最终版本(Java热点(TM)64位服务器虚拟机,Java 1.6.026)
首先看这个例子:
scala> var a = 1
a: Int = 1
scala> var c = 'c
c: Symbol = 'c
scala> var d = 1.1
d: Double = 1.1
scala> var b = "123"
b: java.lang.String = 123
scala> val e:String = "234"
e: String = 234
因此,您可以看到除string之外的其他文本,默认类型是Scala类型(Int Double Symbol
)
但是字符串文字是Java类型的。(java.lang.String
当您使用scala类型String
定义一个值时,字符串文本将是scala字符串类型
为什么字符串文本的默认类型不是Scala字符串
第二:
当您必须从java调用scala方法时
您的scala方法的参数如下:
def hello(i:Int) = {
println(i)
}
在java方面。如果你这样打电话
反对。你好(空)
它将因类型不匹配而失败
java.lang.Integer
可以为空。但是scalaInt
不能为空
scala中的null是AnyRef的子类型。一点也不
我发现AnyRef和AnyVal把我带到了java1。世界上没有汽车箱
# 1 楼答案
missingfaktor已经回答了你的第一个问题
关于你问题的第二部分:Scala。Int与java不同。lang.Integer,它实际上是java int的别名,并且具有几乎相同的行为:
所以斯卡拉对待斯卡拉。尽可能使用Int。请注意,自动装箱/取消装箱与正常情况相同
所以实际上,将null传递给一个需要int的方法是没有意义的。这在Java中也是一个编译错误
如果强制使用空java。lang.Integer被传递到需要int的地方,然后得到一个NullPointerException。这与Java的行为完全相同
如果你想创建一个scala方法,它接受一个可为空的对象,那么把它声明为接受java。整型。自动装箱/取消装箱行为将与Java完全相同
# 2 楼答案
回答第一个问题:
scala.String
只是在Prelude
Predef
中定义的一个类型同义词,表示好的java.lang.String
。(与scala.Int
、scala.Float
等不同,它们是与java.lang.Integer
、java.lang.Float
等不同的类型。)这可能有助于:(观察类型。)