【问题标题】:Scala - unbound wildcard exception (Play Framework 2.3 Template)Scala - 未绑定通配符异常(Play Framework 2.3 模板)
【发布时间】:2015-03-13 16:56:11
【问题描述】:

我正在使用 Play Framework 2.3 我正在使用 scala 模板引擎在其他地方创建我的视图和 Java。

我的模型像这样扩展了一个抽象的参数化对象......(伪代码)

抽象对象:

public abstract class MyObject<T> {

    // various bits

    public class MyInnerObject {

        // more stuff

    }

}

模型对象(单例)

public class SomeModel extends MyObject<SomeBean> {

    public static SomeModel getInstance() {
        if (instance == null)
            instance = new SomeModel();
        return instance;
    }

    // more bits

}

然后我将模型从另一个视图助手传递给视图:

@MyHelper(SomeModel.getInstance())

MyHelper scala 视图模板:

@*******************************************
 * My helper
 *******************************************@

@(myObj: some.namespace.MyObject[_])

@import some.namespace.MyObject

@doSomething(myInnerObj: MyObject[_]#MyInnerObject) = {
    @* do some stuff *@
}

    @for(myInnerObj <- myObj.getInnerObjects()) {
        @doSomething(myInnerObj)
    }

但是我在@doSomething(myInnerObj: MyObject[_]#MyInnerObject) 声明的行上收到一个错误

unbound wildcard exception

我不确定避免这个错误的正确 Scala 语法我天真地假设我可以使用 _ 来指定任意类型,但它不会让我这样做。

正确的语法是什么?

更新 1

将方法定义更改为:

@doSomething[T](myInnerObj: MyObject[T]#MyInnerObject)

给出更多错误:

no type parameters for method doSomething: (myInnerObj:[T]#MyInnerObject)play.twirl.api.HtmlFormat.Appendable exist so that it can be applied to arguments (myObj.MyInnerObject)
--- because ---
argument expression's type is not compatible with formal parameter type;
found : myObj.MyInnerObject
required: MyObject[?T]#MyInnerObject

Twirl 模板引擎目前似乎不支持这种语法,尽管我不是 100% 确定。

【问题讨论】:

标签: scala playframework playframework-2.3


【解决方案1】:

我可以通过完全删除doSomething方法来解决问题...

@*******************************************
 * My helper
 *******************************************@

@(myObj: some.namespace.MyObject[_])

@import some.namespace.MyObject

    @for(myInnerObj <- myObj.getInnerObjects()) {
        <div>@myInnerObj.getSomeProperty()</div>
    }

但是我对这个解决方案大约有 10% 的满意......它至少可以工作,但感觉非常受限,我不能委托方法来帮助保持我的代码可维护。从 cmets 的外观来看,问题似乎是 Twirl 中的一个限制,不允许视图中函数的类型参数。

注意:我接受了这个答案,因为它消除了异常的原始问题,但这只是因为我想要的解决方案还不存在......。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 2015-04-10
    • 2015-05-13
    相关资源
    最近更新 更多