Scala - 如何将Option [X]转换为Option [y]

时间:2014-08-07 22:13:51

标签: scala playframework scaldi

我有简单的服务类

trait ItemService[+A] {
  def getItem(id: Int): Option[A]
}
class MockItemService(implicit inj: Injector) extends ItemService[Item] with Injectable      {
  def getItem(id: Int) =  {
     Option(new Feature("My Headline",Author(2,"Barry White")))
  }
}

使用scaldi im将MockItemService绑定到ItemService然后访问类似

class Features(implicit inj: Injector) extends Controller with Injectable {
   val itemService = inject [ItemService[Item]]
   def item(cat:String, id:Int, urlTitle:String) = Action {   
      itemService.getItem(id).map { item => Ok(views.html.feature.item(item))      
   }.getOrElse(NotFound)    
  }  
}

我想要的是项目类型为Feature而不是Item。功能扩展了项目。

2 个答案:

答案 0 :(得分:0)

    class Features(implicit inj: Injector) extends Controller with Injectable {
      val itemService = inject [ItemService[Item]]

      def item(cat:String, id:Int, urlTitle:String) = Action {
        itemService.getItem(id).map { item =>
           item match {
             case Feature(itsAFeature) => Ok(views.html.feature.item(itsAFeature))
             case itsAnItem => ???
           }
        }.getOrElse(NotFound)
      }
    }

答案 1 :(得分:0)

我发现这很有用

  itemService.getItem(id).map { item =>
       item match {
         case x: Feature => Ok(views.html.feature.item(x))
         case _: Any => NotFound
       }
    }.getOrElse(NotFound)

它仍然感觉有点笨重。 我基本上希望getItem返回不同类型的对象,这些对象都是Item的子类型,但在某些时候我需要处理特定类型的对象。我可以做getFeature等,但在调用getItem之前我可能不知道类型。如果控制器不需要知道具体细节那么肯定是一个好主意它不会。