проводной дизайн типа скала - PullRequest
3 голосов
/ 03 октября 2011

мой env:

Scala версии 2.9.1.final (Java HotSpot (TM) 64-разрядная серверная виртуальная машина, 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?

Во-вторых:

когда вы должны вызывать метод scala из Java.

и ваш метод scala с параметром следующим образом:

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

на стороне Java. если ты так позвонишь.

object.hello (нуль)

произойдет сбой при несовпадении типов.

java.lang.Integer может быть нулевым. но scala Int не может быть нулевым.

null в scala - это подтип AnyRef. не AnyVal ..

я обнаружил, что AnyRef и AnyVal ведут меня в мир java1.4, в котором нет автобокса ...

Ответы [ 2 ]

8 голосов
/ 03 октября 2011

Ответ на ваш первый вопрос:

scala.String - это просто синоним типа, определенный в Prelude Predef для старого доброго java.lang.String.(В отличие от scala.Int, scala.Float и т. Д., Которые отличаются от java.lang.Integer, java.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
6 голосов
/ 03 октября 2011

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

Если вы принудительно передаете нулевой 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...