Отсутствует манифест для старшего типа - PullRequest
3 голосов
/ 21 ноября 2011

У меня проблемы со скалаком, так как я не могу найти манифест для внутреннего типа с более высоким родом, который я хочу использовать.Рассмотрим некоторый список типа типа с конструктором:

trait L[S, A]

def emptyList[S, A: Manifest]: L[S, A] = ???

Теперь другой тип, который создается из его сопутствующего объекта, подобного этому:

object Tree {
  private class Leaf[S, A]
  private class Impl[S, A](l: L[S, Leaf[S, A]]) extends Tree[S, A]

  def empty[S, A]: Tree[S, A] = new Impl(emptyList[S, Leaf[S, A]])
}
trait Tree[S, A]

Сбой, потому что scalac хочет манифест для типа Leaf[S, A].Почему это не доступно?Я не хочу ослаблять видимость Leaf и загромождать конструктор, прося передать явный аргумент.

Я вообще не понимаю этого - я думал, что с точки зрения JVM массивыкоторые построены в L сводятся к Array[Leaf[_, _]] он же Array[java.lang.Object], так какой смысл в этом отказе?

Есть ли способы найти манифест?

1 Ответ

4 голосов
/ 21 ноября 2011

Вы должны предоставить манифест для всех ваших параметров, фактически создавая полную цепочку манифеста:

def emptyList[ S, A : Manifest ] {}
class Leaf[ S, A ]
def emptyTree[ S: Manifest, A : Manifest ] { emptyList[ S, Leaf[ S, A ]]}
...