You are right in thinking that somehow there must be a mechanism to avoid casting. Such a cast would be ugly and redundant, since it still appears in the filter. findhowever, it does not at all care about the form of the predicate that it receives; it just applies it and returns Option[A]if it Ais a static type of collection items.
You need a function collect:
val boss = People.all.collect { case boss: Authority => boss }.head
collect . ( , Authority) , view, :
val boss = People.all.view.collect { case boss: Authority => boss }.head
, , , , , . :
val bossOpt = People.all.view.collect { case boss: Authority => boss }.headOption
bossOpt.foreach(_.giveOrder)
: , Scala 2.9, collectFirst, .