加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – Play Framework模板中的有界通用参数

发布时间:2020-12-16 09:59:55 所属栏目:安全 来源:网络整理
导读:如何在Play Framework 2.3 Java项目中的Scala模板中使用有界通用参数? 我目前有类似的东西: @(entities: List[_ : Entity],currentEntity: Entity)ul @for(entity - entities) { @if(currentEntity.equals(entity)) { listrong@entity/strong/li } else {
如何在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>

但是,我可以在实体和currentEntity中使用不同类型的实体来调用它 – 这不是很好.我想做的事情如下:

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

但这给了我无效的’@’符号作为编译错误.

解决方法

正如@ m-z指出的那样,它还没有得到支持.但是,您可以通过首先将参数编组到View对象中来获得所需的类型安全性(以另一类类别为代价):

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

现在在您的控制器中,加载一个新的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>
 }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读