【问题标题】:wired scala type design有线 Scala 类型设计
【发布时间】:2011-11-29 17:41:05
【问题描述】:

我的环境是:

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

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

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

当您使用 Scala 类型 String 定义值时,字符串文字将是 Scala String 类型。

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

第二:

当你必须从 java 调用 scala 方法时。

你的 scala 方法的参数如下:

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

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

object.hello(null)

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

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

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

我发现 AnyRef 和 A​​nyVal 带我进入 java1.4 世界,它没有自动框..。

【问题讨论】:

  • 能否请您将您的问题更具体一些。你能澄清你的问题吗?
  • 如果您有两个问题,请提出两个问题。并尝试使主题更接近问题 - 如果您这样做了,Stack Overflow 会向您显示您的第一个问题与其重复的问题。

标签: java scala


【解决方案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

所以 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

如果您强制将 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
....

如果你想创建一个接受可为空对象的 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

【讨论】:

    【解决方案2】:

    回答你的第一个问题:

    scala.String 只是在 Prelude Predef 中定义的类型同义词,用于旧的 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
    

    【讨论】:

    • 你的意思可能是Predef 而不是Prelude :-)
    猜你喜欢
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 2020-03-27
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    相关资源
    最近更新 更多