Какова цель приписываний типа в Scala?

Нет большого количества информации в спецификации на том, что приписывание типа, и конечно, нет ничего там о цели для него. Кроме "создания передачи varargs работают", для чего я использовал бы приписывание типа? Ниже некоторый scala REPL для синтаксиса и эффектов использования его.

scala> val s = "Dave"
s: java.lang.String = Dave

scala> val p = s:Object
p: java.lang.Object = Dave

scala> p.length
<console>:7: error: value length is not a member of java.lang.Object
       p.length
         ^
scala> p.getClass
res10: java.lang.Class[_ <: java.lang.Object] = class java.lang.String

scala> s.getClass
res11: java.lang.Class[_ <: java.lang.Object] = class java.lang.String

scala> p.asInstanceOf[String].length
res9: Int = 4
71
задан rightfold 13 October 2014 в 13:49
поделиться

3 ответа

Тип Ограничения просто говорит компилятору, какой тип вы ожидаете из выражения, от всех возможных действительных типов.

Тип действителен, если он уважает существующие ограничения, такие как дисперсионные и тип объявлений, и это либо одно из типов, которое это применяется к «, является , или есть преобразование, которое применяется в области.

Итак, java.lang.string расширяет java.lang.Object , поэтому любой строка также является объектом . В вашем примере вы заявили, что вы хотите, чтобы выражение S относиться к объекту , а не строку . Поскольку нет никаких ограничений, предотвращающих это, и желаемый тип является одним из типов S - это , это работает.

Теперь, почему вы этого хотели? Рассмотрим это:

scala> val s = "Dave"
s: java.lang.String = Dave

scala> val p = s: Object
p: java.lang.Object = Dave

scala> val ss = scala.collection.mutable.Set(s)
ss: scala.collection.mutable.Set[java.lang.String] = Set(Dave)

scala> val ps = scala.collection.mutable.Set(p)
ps: scala.collection.mutable.Set[java.lang.Object] = Set(Dave)

scala> ss += Nil
<console>:7: error: type mismatch;
 found   : scala.collection.immutable.Nil.type (with underlying type object Nil)
 required: java.lang.String
       ss += Nil
             ^

scala> ps += Nil
res3: ps.type = Set(List(), Dave)

Вы также можете исправить это по типу Appting S в SS , или вы могли бы объявить SS тип, чтобы быть Установите [Anyref] .

Тем не менее, типовые декларации достигают то же самое только до тех пор, пока вы назначаете значение идентификатору. Конечно, какой из них всегда может сделать, если человек не заботится о том, чтобы засорение кода с идентификаторами одним выстрелом. Например, следующее не компилируется:

def prefixesOf(s: String) = s.foldLeft(Nil) { 
  case (head :: tail, char) => (head + char) :: head :: tail
  case (lst, char) => char.toString :: lst
}

, но это делает:

def prefixesOf(s: String) = s.foldLeft(Nil: List[String]) { 
  case (head :: tail, char) => (head + char) :: head :: tail
  case (lst, char) => char.toString :: lst
}

Это было бы глупо использовать идентификатор здесь, на месте NIL . И хотя я мог бы просто написать список [String] () вместо этого, это не всегда вариант. Рассмотрим это, например:

def firstVowel(s: String) = s.foldLeft(None: Option[Char]) { 
  case (None, char) => if ("aeiou" contains char.toLower) Some(char) else None
  case (vowel, _) => vowel
}

для справки, это то, что SCALA 2.7 SPEC (15 марта 2009 года) должно сказать о типе Оприняемая:

Expr1 ::= ...
        | PostfixExpr Ascription

Ascription ::= ‘:’ InfixType
             | ‘:’ Annotation {Annotation}
             | ‘:’ ‘_’ ‘*’
75
ответ дан 24 November 2019 в 13:05
поделиться

Одной из возможностей является когда сетевой и последовательный протокол Уровень вещей, то это:

val x = 2 : Byte

намного чище, чем

val x = 2.asInstanceOf[Byte]

, вторая форма также является преобразованием времени выполнения (не обрабатывается компилятором) и может привести к некоторым интересным условиям превышения.

27
ответ дан 24 November 2019 в 13:05
поделиться

Вы можете найти эта нить , освещающих, если немного запутанному, чтобы следовать. Важно отметить, что вы добавляете ограничения подсказки к проверке типа - он дает вам немного больше контроля над тем, что делает эта фаза компиляции.

0
ответ дан 24 November 2019 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: