Scala - 未绑定通配符异常(Play Framework 2.3 模板)
Scala - unbound wildcard exception (Play Framework 2.3 Template)
我正在使用 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% 确定。
我可以通过完全删除 doSomething
方法来解决问题...
@*******************************************
* My helper
*******************************************@
@(myObj: some.namespace.MyObject[_])
@import some.namespace.MyObject
@for(myInnerObj <- myObj.getInnerObjects()) {
<div>@myInnerObj.getSomeProperty()</div>
}
但我对解决方案的满意度大约为 10%...它至少可以工作,但感觉非常受限,因为我无法委托方法来帮助保持代码的可维护性。从评论来看,问题似乎是 Twirl 中的一个限制,不允许在视图中为函数使用类型参数。
注意:我已经接受了这个答案,因为它消除了异常的原始问题,但这只是因为我想要的解决方案不存在......但是。
我正在使用 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% 确定。
我可以通过完全删除 doSomething
方法来解决问题...
@*******************************************
* My helper
*******************************************@
@(myObj: some.namespace.MyObject[_])
@import some.namespace.MyObject
@for(myInnerObj <- myObj.getInnerObjects()) {
<div>@myInnerObj.getSomeProperty()</div>
}
但我对解决方案的满意度大约为 10%...它至少可以工作,但感觉非常受限,因为我无法委托方法来帮助保持代码的可维护性。从评论来看,问题似乎是 Twirl 中的一个限制,不允许在视图中为函数使用类型参数。
注意:我已经接受了这个答案,因为它消除了异常的原始问题,但这只是因为我想要的解决方案不存在......但是。