有线scala型设计

Sai*_*ito 3 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
Run Code Online (Sandbox Code Playgroud)

所以,你可以看到除字符串之外的其他文字,默认类型是Scala Types(Int Double Symbol.

但字符串文字是Java类型.(java.lang.String

当您使用scala类型定义值时String,String文字将是Scala String类型.

为什么字符串文字的默认类型不是Scala String?

第二:

什么时候必须从java调用scala方法.

和你的scala方法参数如下:

def hello(i:Int) = {
    println(i)
}
Run Code Online (Sandbox Code Playgroud)

在java方面.如果你这样打电话

object.hello(空)

它会因类型不匹配而失败.

java.lang.Integer可以为空.但是scala Int不能为空.

scala中的null是AnyRef的子类型.不是AnyVal ..

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

mis*_*tor 8

回答你的第一个问题:

scala.String只是为了好老而定义的类型同义词.(不像,等,它们是从不同的类型,等等)Prelude Predefjava.lang.Stringscala.Intscala.Floatjava.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
Run Code Online (Sandbox Code Playgroud)


Mat*_*ell 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
Run Code Online (Sandbox Code Playgroud)

所以scala将scala.Int视为int尽可能.请注意,自动装箱/拆箱正常进行.

scala> print(new java.lang.Integer(666))
666 class=int
Run Code Online (Sandbox Code Playgroud)

实际上,将null传递给期望int的方法是没有意义的.这也是Java中的编译错误.

private void setInt(int i) {}
setInt(null); // compilation error
Run Code Online (Sandbox Code Playgroud)

如果强制将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
....
Run Code Online (Sandbox Code Playgroud)

如果要创建一个采用可为空的对象的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
Run Code Online (Sandbox Code Playgroud)