Scalatypes归属的目的是什么?

关于什么types归属没有太多的信息,关于它的目的当然没有任何内容。 除了“传递可变参数”之外,我还会用什么types的归类? 下面是使用它的语法和效果的一些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 

types归属只是告诉编译器从所有可能的有效types中得到的expression式。

一个types是有效的,如果它尊重现有的约束,例如方差和types声明,它是适用于“ ”的expression式的types之一,或者有一个适用于范围的转换。

所以, java.lang.String extends java.lang.Object ,因此任何String也是一个Object 。 在你的例子中,你声明你希望expression式s被视为一个Object ,而不是一个String 。 由于没有约束,所以所需的types是s 是a的types之一,它的工作原理。

现在,你为什么要这样? 考虑这个:

 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) 

你也可以通过在ss声明中inputSet[AnyRef]来解决这个问题,或者你可以声明ss的types为Set[AnyRef]

但是,只要您为标识符赋值,types声明就会实现相同的function。 当然,如果一个人不关心用一次性标识符乱抛垃圾的代码,哪一个人总是可以做的。 例如,以下不能编译:

 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是愚蠢的。 虽然我可以只写List[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 } 

作为参考,这是斯卡拉2.7规范(2009年3月15日草案)不得不说关于types归属:

 Expr1 ::= ... | PostfixExpr Ascription Ascription ::= ':' InfixType | ':' Annotation {Annotation} | ':' '_' '*' 

一种可能是当networking和串行协议级别的东西,那么这个:

 val x = 2 : Byte 

比…更清洁

 val x = 2.asInstanceOf[Byte] 

第二种forms也是运行时转换(不由编译器处理),并可能导致一些有趣的上/下溢条件。

我使用types归属来在Scala的types推断上打孔。 例如,对于typesA的集合,foldLeft取一个typesB的初始元素和一个函数(B,A)=> B,用于将集合的元素折叠到初始元素中。 typesB的实际值是从初始元素的types推断出来的。 由于无扩展List [Nothing],因此将其用作初始元素会导致问题:

 scala> val x = List(1,2,3,4) x: List[Int] = List(1, 2, 3, 4) scala> x.foldLeft(Nil)( (acc,elem) => elem::acc) <console>:9: error: type mismatch; found : List[Int] required: scala.collection.immutable.Nil.type x.foldLeft(Nil)( (acc,elem) => elem::acc) ^ scala> x.foldLeft(Nil:List[Int])( (acc,elem) => elem::acc ) res2: List[Int] = List(4, 3, 2, 1) 

或者,您可以使用List.empty [Int]而不是Nil:List [Int]。

 scala> x.foldLeft(List.empty[Int])( (acc,elem) => elem::acc ) res3: List[Int] = List(4, 3, 2, 1) 

编辑:List.empty [A]被实现为

 override def empty[A]: List[A] = Nil 

(资源)

这实际上是一个更详细的无forms:列表[A]

你可能会发现这个线程照亮,如果有点复杂跟随。 需要注意的重要一点是,您正在向types检查器添加约束提示 – 它使您对编译阶段正在进行的操作有更多的控制权。

types推断:我们可以跳过显式给出源代码中的types名称,称为types推理(虽然在一些特殊情况下是必需的)。

types归属:明确某种types的东西称为types归属。 它可以做什么差异?

例如:val x = 2:Byte

另请参阅:1.我们可以明确地给我们的函数返回types

 def t1 : Option[Option[String]] = Some(None) > t1: Option[Option[String]] 

另一种说法是:

 def t2 = Some(None: Option[String]) > t2: Some[Option[String]] 

这里我们没有明确地给出Option[Option[String]]返回types,编译器推断它是Some[Option[String]] 。 为什么Some[Option[String]]是因为我们在定义中使用了types归属。

  1. 我们可以使用相同定义的另一种方法是:

    def t3 = Some(None)

    > t3: Some[None.type]

这一次我们没有明确地告诉编译器什么(既没有defi)。 它推断我们的定义是Some [None.type]

Interesting Posts