Нет большого количества информации в спецификации на том, что приписывание типа, и конечно, нет ничего там о цели для него. Кроме "создания передачи 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
Тип Ограничения просто говорит компилятору, какой тип вы ожидаете из выражения, от всех возможных действительных типов.
Тип действителен, если он уважает существующие ограничения, такие как дисперсионные и тип объявлений, и это либо одно из типов, которое это применяется к «, является , или есть преобразование, которое применяется в области.
Итак, 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}
| ‘:’ ‘_’ ‘*’
Одной из возможностей является когда сетевой и последовательный протокол Уровень вещей, то это:
val x = 2 : Byte
намного чище, чем
val x = 2.asInstanceOf[Byte]
, вторая форма также является преобразованием времени выполнения (не обрабатывается компилятором) и может привести к некоторым интересным условиям превышения.
Вы можете найти эта нить , освещающих, если немного запутанному, чтобы следовать. Важно отметить, что вы добавляете ограничения подсказки к проверке типа - он дает вам немного больше контроля над тем, что делает эта фаза компиляции.