1

一言で言えば問題

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

回避策

ラッパーを使用する代わりに、基になるキューをテンプレートに直接渡すと機能します。

4

2 に答える 2

1

ここで言語を混在させています。Twirl テンプレートは Scala にコンパイルされますが、DecisionQueue クラスは Java で記述されます。言語は互換性がありますが、透過的ではありません。Java コレクション (LinkedList) を Scala で反復処理しようとしています。Scala は何らかの助けがなければそれを行う方法を知りません。エラーは、Java コレクションを変換するために使用しようとした暗黙的な関数にあいまいさが見つかったことを示しています。次のように、コンバーターをインポートして使用することで、少し手助けしたいと思うかもしれません。

@(decisionQueue: data.DecisionQueue)
import scala.collection.JavaConversions._
<ul>
@for(decision <- decisionQueue.iterator) // Problem here
  // redacted
}
</ul>
于 2014-10-27T04:01:00.093 に答える