什么是"字符串与Int"应该是什么意思?

时间:2014-11-22 17:48:38

标签: scala types type-inference

> val foo: PartialFunction[String, Unit] = { case i: String => }
foo: PartialFunction[String,Unit] = <function1>

> val bar: PartialFunction[Int, Unit] = { case i: Int => }
bar: PartialFunction[Int,Unit] = <function1>

> foo orElse bar
PartialFunction[String with Int,Unit] = <function1>

什么是String with Int?。我认为这甚至不可能。

> (foo orElse bar)(new String with Int)
error: illegal inheritance from final class String
  (foo orElse bar)(new String with Int)
                       ^
error: class Int needs to be a trait to be mixed in
  (foo orElse bar)(new String with Int)
                                   ^

不应该是PartialFunction[Nothing,Unit]吗?

2 个答案:

答案 0 :(得分:7)

  

Int的字符串是什么?

它是一种交集类型。即此类型的值必须同时为IntString

  

我认为这甚至不可能。

是的,这是一种无人居住的类型。但是,一般情况下,如果您使用某些类型IntString替换AB,那么您将获得PartialFunction[A with B, Unit]并且编译器没有&#39}对此有一个特例。

答案 1 :(得分:1)

好吧,如前所述,它是一个复合类型,它适用于任何两种类型(类,特征),如下面的代码所示:

class B
class C extends B
class D extends C

val bf: PartialFunction[B, Unit] = {case b: B => println("some b") }
val cf: PartialFunction[C, Unit] = {case c: C => println("some c") }
val g = bf orElse cf

g(new D) // some b

只是有时它在某些情况下缺乏意识。这些链接可能有用:

http://www.scala-lang.org/old/node/110

http://www.scala-lang.org/files/archive/spec/2.11/03-types.html#compound-types