我的环境是:
Scala版本2.9.1.final(Java HotSpot(TM)64位服务器VM,Java 1.6.0_26)。
首先看一下这个例子:
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
所以,你可以看到除字符串之外的其他文字,默认类型是Scala Types(Int Double Symbol
。
但字符串文字是Java类型。(java.lang.String
当您使用scala类型String
定义值时,String文字将是Scala字符串类型。
为什么字符串文字的默认类型不是Scala String?
第二
什么时候必须从java调用scala方法。
和你的scala方法,参数如下:
def hello(i:Int) = {
println(i)
}
在java方面。如果你这样打电话。
object.hello(空)
它会因类型不匹配而失败。
java.lang.Integer
可以为null。但是scala Int
不能为空。
null是AnyRef的子类型。不是AnyVal ..
我发现AnyRef和AnyVal将我带到java1.4世界,它没有autobox ..
答案 0 :(得分:8)
回答你的第一个问题:
scala.String
只是 Prelude
Predef
中为好老java.lang.String
定义的类型同义词。 (与scala.Int
,scala.Float
等不同,它们是java.lang.Integer
,java.lang.Float
等不同类型。)
这可能会有所帮助:(观察类型。)
scala> def f(s: String) = s * 2
f: (s: String)String
scala> f("hello")
res7: String = hellohello
scala> def f(s: String): java.lang.String = s * 2
f: (s: String)java.lang.String
scala> f("hello")
res8: java.lang.String = hellohello
scala> type Str = String
defined type alias Str
scala> def f(s: String): Str = s * 2
f: (s: String)Str
scala> f("hello")
res9: Str = hellohello
答案 1 :(得分:6)
missingfaktor回答了你的第一个问题。
对于你的问题的第二部分:Scala.Int与java.lang.Integer不同,它实际上是java int的别名,并且具有几乎相同的行为:
scala> def print(i: Int) = println(i + " class=" + i.getClass.getName)
print: (i: Int)Unit
scala> print(43)
43 class=int
因此scala将scala.Int视为可能的int。请注意,自动装箱/拆箱正常进行。
scala> print(new java.lang.Integer(666))
666 class=int
实际上,将null传递给期望int的方法是没有意义的。这也是Java中的编译错误。
private void setInt(int i) {}
setInt(null); // compilation error
如果强制将null java.lang.Integer传递到期望int的位置,则会出现NullPointerException。这与Java完全相同。
scala> val f: java.lang.Integer = null
f: java.lang.Integer = null
scala> print(f)
java.lang.NullPointerException
....
如果要创建一个带有可为空的对象的scala方法,请声明它采用java.lang.Integer。自动装箱/拆箱行为与Java完全相同。
scala> def print(i: java.lang.Integer) = println(i + " class=" + i.getClass.getName)
print: (i: java.lang.Integer)Unit
scala> print(43)
43 class=java.lang.Integer
scala> print(new java.lang.Integer(666))
666 class=java.lang.Integer