我的环境是:
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 ..
回答你的第一个问题:
scala.String只是为了好老而定义的类型同义词.(不像,等,它们是从不同的类型,等等)PreludePredefjava.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)
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)
| 归档时间: |
|
| 查看次数: |
301 次 |
| 最近记录: |