有线scala型设计

时间:2011-10-03 07:30:59

标签: java scala

我的环境是:

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不能为空。

scala中的

null是AnyRef的子类型。不是AnyVal ..

我发现AnyRef和AnyVal将我带到java1.4世界,它没有autobox ..

2 个答案:

答案 0 :(得分:8)

回答你的第一个问题:

scala.String只是 Prelude Predef中为好老java.lang.String定义的类型同义词。 (与scala.Intscala.Float等不同,它们是java.lang.Integerjava.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