Могу ли я объявить класс декоратора, который расширяет свой собственный параметр типа? - PullRequest
1 голос
/ 29 марта 2011

Я хотел бы сделать что-то вроде этого:

case class D[X <: A](arg1 : X, arg2: Int) extends X {
}

D - это своего рода класс декоратора для arg1, и я хотел бы применить его к нескольким видам вещей, которые являются подклассамиA.

Однако я получаю эту ошибку:

scala> case case D [X <: A] (arg1: X, arg2: Int) расширяет X {переопределить val name =«Д»;}: 6: ошибка: требуется тип класса, но X найдено </p>

Если нет, есть ли более грубый способ сделать это?

1 Ответ

1 голос
/ 30 марта 2011

Расширяемый класс должен быть известен во время компиляции, а параметр типа, как правило, - нет. Следовательно, это невозможно сделать.

Однако, если вы пытаетесь расширить X, чтобы извлечь выгоду из реализаций методов, определенных в признаке интерфейса A, тогда вы можете добавить X при создании экземпляра класса.

new D with X

Если вы хотите сохранить функции 'case class' D, тогда используйте D в качестве прокси, который перенаправляет вызовы методов, определенных в A, в параметр arg1 типа X это одно решение.

trait A {
  def foo
}
case class D[X <: A](arg1: X) extends A {
  def forw = arg1
  def foo = forw.foo
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...