我在斯卡拉有这门课
trait PageComponent {
protected var page:Page = _
protected var pageData:PageData = _
def initialise(page0:Page, pageData0:PageData) {
page = page0
pageData = pageData0
}
}
PageComponent 的每个子类也都有自己的 Page 和 PageData 子类。当子类调用 page 或 pageData 时,我希望它为此返回它自己的类型。
我试过像
trait PageComponent {
type P <: Page
protected var page:P = _
protected var pageData:PageData = _
def initialise(page0:P, pageData0:PageData) {
page = page0
pageData = pageData0
}
}
这种工作使得子类可以调用 page 并获取通过实现类型 P 定义的页面类型。
但是,我正在尝试调用 initialise 方法,并且正在传递 Page 类型的对象,它显示了此错误
error: type mismatch;
found : pageInfoToGoTo.page.type (with underlying type com.xxx.gui.Page)
required: pageComponentToGoTo.P
pageComponentToGoTo.initialise(pageInfoToGoTo.page, pageData)
我在这里显然错了,但我认为因为 P“是一个”页面这应该对我有用。
有任何想法吗?
------编辑以获取更多信息-----
我确实有类似的东西
class AhoyPage extends Page
object MyPageComponent extends PageComponent {
type P = AhoyPage
}
阅读 jwinandy 的答案后,我更改了代码,以便以这种方式调用初始化方法
pageComponentToGoTo.initialise(pageInfoToGoTo.page.asInstanceOf[pageComponentToGoTo.P], pageData)
现在它可以工作了。所以我想我的问题得到了回答。谢谢。不过这个演员阵容不是很好。我有一个看起来像这样的 PageInfo 列表
PageInfo(page:Page, ...)
选择PageInfo时,我使用该页面查找地图中的页面组件。必须有更好的方法,但如果没有,我对此很满意。