2014-11-22 94 views
4
> 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]

回答

7

什么是字符串与INT?

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

我不认为这是可能的。

是的,这是一种无人居住的类型。但是,一般情况下,如果将IntString替换为某些类型AB,则会得到PartialFunction[A with B, Unit],编译器对此没有特殊情况。

+1

那么,它会* *让你传入null,用合适的演员。这没有多大帮助,但它确实在技术上有用。 – 2014-11-22 17:57:41

+0

啊,我会预料到'A with B'只有在'B'是一个特质时才有效。 – 2014-11-22 18:02:01

+0

我只用Scala 2.9.2测试过,因为这是我得心应手的。不确定新版本的行为是否有所不同。 – 2014-11-22 18:03:41

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