我定义了以下类 PositionSpace,它具有嵌套类 Position 和 SubPositionSpace。SubPositionSpace 本身既是 Position 又是 PositionSpace(因此它是一个也定义了自己的位置的位置)。我已经定义了一个包装类 SubPosition,以便任何类型为 x.SubPositionSpace#Position 的对象(对于任何作为 PositionSpace 的对象 x)都可以用作类型为 x.Position 的对象。但是,我想让这种转换隐含,这就是我卡住的地方。从逻辑上讲,这应该是可能的。但是,我不知道在哪里或如何定义转换以便编译器找到它,这让我很头疼。
下面是我的代码。请注意,我已在底部添加了测试用例。
class PositionSpace { positionSpace =>
//snip
trait Position extends Ordered[Position] {
//snip
}
class SubPositionSpace() extends PositionSpace with Position { subPositionSpace =>
//snip
//wrapper class to treat a x.SubPositionSpace#Position as a x.Position for some x : PositionSpace
//want to make this conversion implicit!!!
class SubPosition(private val subPositionIndex : subPositionSpace.Position) extends positionSpace.Position {
//snip
}
}
def append() = new Position{
//snip
}
def appendSubSpace() = new SubPositionSpace()
}
object TestCases {
val positionSpace = new PositionSpace()
val subSpace = positionSpace.appendSubSpace()
val subSpacePosition = subSpace.append()
//Does not compile, needs an implicit conversion:
val subSpacePositionAsPosition : positionSpace.Position = subSpacePosition
val subSubSpace = subSpace.appendSubSpace()
//Does not compile, needs an implicit conversion:
val subSubSpacePositionAsPosition : positionSpace.Position = subSubSpace
}
到目前为止我遇到的障碍
路径相关类型
部分问题似乎是这种转换涉及依赖于路径的类型,其中输入类型和输出类型使用相同的路径。但是,没有语法可以编写带有类型签名的方法x.Position => y.Position where y : PositionSpace and x : y.SubPositionSpace.
通过添加附加参数以传递路径(如下所示)很容易解决问题,但是您不能向隐式转换方法添加附加参数(如果你希望它们被这样使用)。
//Too many arguments, won't be used by compiler for implicit conversions
implicit def promotePosition(y : PositionSpace, x : y.PositionSpace, x.Position) : y.Position = ...