我的项目中有代表 ID 的对象。
假设它是ChairId、TableId、LampId。我希望它们都继承自 GenericId。我希望能够打电话def f(x: GenericId) = x.id
我希望他们只持有单身id: String
,所以我想让他们扩展 AnyVal。
此外,我希望每种类型都提供generate
会生成我的特定 ID 的功能,即我想输入类似ChairId.generate()
我输入了这个:
sealed abstract class GenericId(val id: String)
final case class ChairId(override val id: String) extends GenericId(id)
final case class TableId(override val id: String) extends GenericId(id
而且我虽然如果 GenericId 会从 AnyVal 继承,那将起作用,但到目前为止还没有运气;/我还尝试使 GenericId 成为一个特征,并使案例类使用 GenericId 扩展 AnyVal,但也不会编译:/
另一件事是TableId.generate()
我可以只提供带有功能的伴生对象generate
,这基本上解决了我的问题,但我想知道是否有可能在不定义伴生对象的情况下解决这个问题?(即通过某种方式隐含)
// 编辑
关于提供无法编译的代码的评论(我想):
sealed abstract class AbstractId(val id: String) extends AnyVal
final case class CatId(override val id: String) extends AbstractId(id)
final case class DogId(override val id: String) extends AbstractId(id)