所以我希望将一个通用特征作为一个类型参数,一个具有从特定基类继承的伴随对象的类,并引用伴随对象和类本身.所以,
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)
}
Run Code Online (Sandbox Code Playgroud)
我有一些解决方案,这个特性更接近,但我把它提炼下来,这样你就可以看到我想要做的事情.
谢谢
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)
}
Run Code Online (Sandbox Code Playgroud)
因此,类型参数更改为BaseCrud,并将隐式添加到BaseCrud.table并在Controller.model中实现.我也解决了所有错别字.我觉得有趣的是Customer.type似乎是伴侣对象的类型.
你的代码中有很多问题......让我们一个接一个地解决它:
def table[T](...请注意,这会T覆盖方法范围的原始类型参数.不是你想要的,所以只要省略它就可以了def table(...object Controller with BaseCrud { 还包含两个错误:
extends不是with.后者仅在您已从某些基类/特征扩展后使用.BaseCrud 需要一个你必须在这里指定的类型参数,所以类似于 BaseCrud[Customer]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)
}
Run Code Online (Sandbox Code Playgroud)
我认为,您可以在特征self中使用 scala 类型BaseCrud来指定应该混合的类。有关详细信息,请参阅链接的问题。
trait BaseCrud[T] {
self: BaseModel[T] =>
def table(f: T => String): String =
all.map(f).mkString("")
}
object Controller extends BaseModel[Customer] with BaseCrud[Customer]{
def foo = table(_.email)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11412 次 |
| 最近记录: |