scala – 使用类的通用特征,它的伴随对象作为类型参数
所以我希望将一个通用特征作为一个类型参数,一个具有从特定基类继承的伴随对象的类,并引用伴随对象和类本身.所以,
abstract class BaseModel[T] { def all: Seq[T] } case class Customer(email: String,password: String) object Customer extends BaseModel[Customer] // This trait is my issue trait BaseCrud[T] { def table[T](f: T => String): String = { T.all.map(f _).mkString("") } } object Controller with BaseCrud { def foo = table(_.email) } 我有一些解决方案,这个特性更接近,但我把它提炼下来,这样你就可以看到我想要做的事情. 谢谢 UPDATE 所以我选择了Frank下面的解决方案,但我确实设法解决了我最初的难题.虽然,在这种情况下解决方案有点难看,但为了完整起见,我会将其包含在这里. abstract class BaseModel[T] { def all: Seq[T] = Seq() } case class Customer(email: String,password: String) object Customer extends BaseModel[Customer] trait BaseCrud[T,U <: BaseModel[T]] { def table(f: T => String)(implicit obj: U): String = { obj.all.map(f(_)).mkString("") } } object Controller extends BaseCrud[Customer,Customer.type] { implicit val model = Customer def foo = table(_.email) } 因此,类型参数更改为BaseCrud,并将隐式添加到BaseCrud.table并在Controller.model中实现.我也解决了所有错别字.我觉得有趣的是Customer.type似乎是伴侣对象的类型. 解决方法
你的代码中有很多问题……让我们一个接一个地解决它:
> def table [T](…请注意,这个T会覆盖方法范围的原始类型参数.不是你想要的,所以只需省略它并制作这个def表(… >它必须延伸而不是.后者仅在您已从某些基类/特征扩展后使用. >最后,回答你的实际问题:类型参数T和伴随对象之间存在巨大差异.它们本质上是不同的东西,因此您无法通过T.something访问伴随对象.相反,您需要以某种其他方式在特征中提供伴随对象,例如作为抽象字段. 这是我认为你想做的一个版本: abstract class BaseModel[T] { def all: Seq[T] } case class Customer(email: String,password: String) object Customer extends BaseModel[Customer] { def all = List[Customer]() // have to define this } trait BaseCrud[T] { val companion : BaseModel[T] def table(f: T => String): String = { companion.all.map(f).mkString("") } } object Controller extends BaseCrud[Customer] { val companion = Customer def foo = table(_.email) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |