你能创建一个包含属性的类型绑定吗?

时间:2017-03-01 18:25:13

标签: scala

我想要一个我可以这样使用的类型:

class Something[T](...) {

}

其中T是具有User类型属性的类。我想这很难,因为我需要知道该物业的名称对吗?

这可能吗?

更新

我根据@ pamu的回答尝试了这个

http://scastie.org/28397

trait GenericMessage {
    def user: User
}

sealed trait UserMessage extends GenericMessage
case class LoginMessage(id: Int, user: User) extends UserMessage

case class User(id: Int)


class UserWorker[UserMessage](name: String) extends Worker[UserMessage](name) {

}

class Worker[T <: GenericMessage](name: String) {
    val tasks = scala.collection.mutable.Queue.empty[T]
}

我收到错误:

type arguments [UserMessage] do not conform to class Worker's type parameter bounds [T <: GenericMessage]
[error] class UserWorker[UserMessage](name: String) extends Worker[UserMessage](name) {

1 个答案:

答案 0 :(得分:1)

是的,你需要知道属性的名称

一种方法是使用包含用户字段并具有约束的超类型,T是特征持有用户字段的子类型

case class User(name: String)

trait UserHolder {
  def user: User
}

class Something[T <: UserHolder](value: T) {
  def foo = value.user
}