Есть ли функция instanceof в механизме шаблонов платформы Play?

Я хотел бы знать, есть ли какая-то функциональность instanceof в механизме шаблонов фреймворка Play (2.0). Это позволило бы мне эффективно использовать структуру наследования на уровне моей модели.

Это в основном то, что я хотел бы (за исключением того, что этот шаблон не компилируется):

@(instance: Superclass)

@main { 
    @if(instance instanceof Subclass) {
        Subclass instanceOfSubclass = (Subclass) instance;    
    }
}

Изменить: я имею в виду конкретную версию Play для Java.


person Christophe    schedule 25.03.2012    source источник


Ответы (1)


Используйте сопоставление шаблонов Scala.

@(instance: Superclass)

@main { 
  @instance match {
    case foo: Foo => {
      <a href="@routes.Foo.index()">@foo.title</a>
    }
    case bar: Bar => {
      <a href="@routes.Bar.index()">@bar.title</a>
    }
  }
}
person Marius Soutier    schedule 26.03.2012
comment
Мне странно, что это работает в мире java, потому что Foo и Bar должны иметь экстрактор (unapply) для сопоставления с образцом. Мне любопытно теперь знать, что делает трюк. Любая подсказка? - person Andy Petrella; 26.03.2012
comment
Я не знаю наверняка. С одной стороны, это сопоставление с образцом проверяет только тип. С другой стороны, Play по-прежнему использует магию байт-кода в Java. В противном случае шаблоны Scala не имели бы особого смысла в среде, которая предлагает API как для Java, так и для Scala. - person Marius Soutier; 26.03.2012
comment
В самом деле... Я, должно быть, устал... Список окончательно не нужен врагам. - person Andy Petrella; 26.03.2012