一言で言えば問題
Playで軽くラップされたコレクションを反復処理することはできません! フレームワークテンプレート。インターフェイスを実装するだけで、テンプレートで for-each ループを使用できるようになると仮定しIterable
ましたが、それは正しくないようです。
どうすればこれを機能させることができますか?
私がしたこと
java.util.Queue の周りに単純なラッパー クラスを作成しました。Iterable を実装すると、Playで for-each ループを使用できるようになると仮定しました。フレームワークテンプレート。
public class DecisionQueue implements Iterable<Decision> {
Queue<Decision> decisions;
public DecisionQueue() {
decisions = new LinkedList<Decision>();
}
// redacted methods for manipulating the queue
@Override
public Iterator<Decision> iterator() {
return decisions.iterator();
}
}
テンプレートにラッパーのインスタンスを提供しました。
public static Result getFormOutput() {
DecisionQueue decisionQueue = getDecisionQueue();
return ok(views.html.questionnaire.output.render(decisionQueue));
}
テンプレートのラッパーを繰り返し処理しようとしました。
@(decisionQueue: data.DecisionQueue)
<ul>
@for(decision <- decisionQueue) // Problem here
// redacted
}
</ul>
コンパイル中に次のスタック トレースを取得しました。
[error] C:\...\app\views\questionnaire\output.scala.html:12: type mismatch;
[error] found : decisionQueue.type (with underlying type models.data.DecisionQueue)
[error] required: ?{def map(x$1: ? >: <error> => play.twirl.api.HtmlFormat.Appendable): ?}
[error] (which expands to) ?{def map(x$1: ? >: <error> => play.twirl.api.Html): ?}
[error] Note that implicit conversions are not applicable because they are ambiguous:
[error] both method javaCollectionToScala in object TemplateMagic of type [T](x: Iterable[T])Iterable[T]
[error] and method iterableAsScalaIterable in trait WrapAsScala of type [A](i: Iterable[A])Iterable[A]
[error] are possible conversion functions from decisionQueue.type to ?{def map(x$1: ? >: <error> => play.twirl.api.HtmlFormat.Appendable): ?}
[error] @for(decision <- decisionQueue) {
[error] ^
[error] one error found
[error] (compile:compile) Compilation failed
回避策
ラッパーを使用する代わりに、基になるキューをテンプレートに直接渡すと機能します。