Java 有线scala型设计
我的环境是: Scala版本2.9.1.final(Java热点(TM)64位服务器虚拟机,Java 1.6.026) 首先看这个例子:Java 有线scala型设计,java,scala,Java,Scala,我的环境是: Scala版本2.9.1.final(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
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类型(Int-Double-Symbol
)
但是字符串文字是Java类型。(Java.lang.string
当您使用scala typeString
定义值时,String文本将是scala String类型
为什么字符串文本的默认类型不是Scala字符串
第二:
当您必须从java调用scala方法时
您的scala方法的参数如下:
def hello(i:Int) = {
println(i)
}
在java方面。如果你这样调用
object.hello(null)
它将因类型不匹配而失败
java.lang.Integer
可以为空。但是scalaInt
不能为空
scala中的null是AnyRef.not AnyVal.的子类型
我发现AnyRef和AnyVal把我带到了java1.4世界,那里没有autobox…回答你的第一个问题:
scala.String
只是在Prelude
Predef
中定义的一个类型同义词,用于良好的旧java.lang.String
(不同于scala.Int
,scala.Float
等,它们是与java.lang.Integer
,java.lang.Float
等不同的类型。)
这可能有助于:(观察类型。)
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
如果强制在需要int的位置传递null java.lang.Integer,则会得到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
请你把你的问题说得更具体一些。请你澄清一下你的问题好吗?可能重复的请,如果你有两个问题,提出两个问题。试着让主题更接近问题——如果你这样做了,Stack Overflow会向你展示你的第一个问题是重复的问题。你可能平均值
Predef
而不是Prelude
:-)
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