scala - Play 框架模板中的有界泛型参数

标签 scala playframework-2.3

如何在 Play Framework 2.3 Java 项目中的 Scala 模板中使用有界泛型参数?

我目前有类似的东西:

@(entities: List[_ <: Entity], currentEntity: Entity)

<ul>
    @for(entity <- entities) {
        @if(currentEntity.equals(entity)) {
            <li><strong>@entity</strong></li>
        } else {
            <li>@entity</li>
        }
    }
</ul>

但是,我可以在 entities 中使用不同类型的实体来调用它。和 currentEntity - 这不好。我想做类似的事情:
@[T <: Entity](entities: List[T], currentEntity: T)
...

但这给了我 Invalid '@' symbol作为编译错误。

最佳答案

正如@m-z 指出的那样,它(尚)不受支持。但是您可能能够通过首先将参数编码到 View 对象中来获得您想要的类型安全(以另一个类家族为代价):

case class HighlightedListView[E <: Entity](entities:List[E], currentEntity:E)

现在在你的 Controller 中,加载一个新的 HighlightedListView实例而不是直接将参数提供给模板:
 def foo = Action {
  ...
  // Assuming some SubEntity exists, the compiler will enforce the typing:
  val hlv = HighlightedListView[SubEntity](entities, currentEntity)


  Ok(html.mytemplate(hlv))

}

正如评论所述,如果您的类型不对齐,编译器将拒绝。那么模板的类型可能会非常松散,因为我们知道我们是安全的:
@(hlv:HighlightedListView[_])

<ul>
    @for(entity <- hlv.entities) {
        @if(hlv.currentEntity.equals(entity)) {
            <li><strong>@entity</strong></li>
        } else {
            <li>@entity</li>
        }
    }
</ul>

您甚至可以利用您的新 View对象添加辅助方法,这可以使模板更易于阅读,并促进单元测试:
case class HighlightedListView[E <: Entity](entities:List[E], currentEntity:E) {
   def shouldHighlight(e:Any):Boolean = currentEntity.equals(e)
}

导致:
 @if(hlv.shouldHighlight(entity)) {
     <li><strong>@entity</strong></li>
 } else {
     <li>@entity</li>
 }

关于scala - Play 框架模板中的有界泛型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29615655/

相关文章:

scala - 从源代码构建 Scala 2.12 二进制文件

scala - 尽管已导入,但未找到解释器结果类型

使用 Java 8 在 Debian 上安装 Scala 和 SBT

java - 静态资源更改时 Play Framework 回复未修改

scala - Spark : GenericMutableRow cannot be cast to java. lang.Byte 和 <none> 不是一个术语

scala - 如何在 sbt 中的 'package' 期间禁用依赖项解析

json - 为什么我使用 JSON Read with Play framework 2.3 得到 "Application does not take parameters"?

java - Akka 和 Play,与非 Controller 库集成

scala - 光滑过滤器的正确使用方法

playframework - Play 框架 2.3 dist 任务 - javascripts-min 不可用