Java 有线scala型设计

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版本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 = "234"
e: String = 234
因此,您可以看到除字符串之外的其他文字,默认类型是Scala类型(
Int-Double-Symbol

但是字符串文字是Java类型。(
Java.lang.string

当您使用scala type
String
定义值时,String文本将是scala String类型

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

第二:

当您必须从java调用scala方法时

您的scala方法的参数如下:

def hello(i:Int) = {
    println(i)
}
在java方面。如果你这样调用

object.hello(null)

它将因类型不匹配而失败

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

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