有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java有线scala类型设计

我的环境是:

Scala版本2.9.1。最终版本(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

因此,您可以看到除string之外的其他文本,默认类型是Scala类型(Int Double Symbol

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

当您使用scala类型String定义一个值时,字符串文本将是scala字符串类型

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

第二:

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

您的scala方法的参数如下:

def hello(i:Int) = {
    println(i)
}

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

反对。你好(空)

它将因类型不匹配而失败

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

scala中的null是AnyRef的子类型。一点也不

我发现AnyRef和AnyVal把我带到了java1。世界上没有汽车箱


共 (2) 个答案

  1. # 1 楼答案

    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
    

    所以斯卡拉对待斯卡拉。尽可能使用Int。请注意,自动装箱/取消装箱与正常情况相同

    scala> print(new java.lang.Integer(666))
    666 class=int
    

    所以实际上,将null传递给一个需要int的方法是没有意义的。这在Java中也是一个编译错误

    private void setInt(int i) {}
    setInt(null); // compilation error
    

    如果强制使用空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。整型。自动装箱/取消装箱行为将与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
    
  2. # 2 楼答案

    回答第一个问题:

    scala.String只是在PreludePredef中定义的一个类型同义词,表示好的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