6

Вопрос по generics – Как определить классы дел с членами с параметрами несвязанного типа?

Дано определение класса с параметром связанного типаAnimal[A <: String] похоже, что компилятор Scala не выводитB <: String отAnimal[B], Разрешен ли вывод? Как помочь компилятору сделать вывод?

Ниже приведен конкретный пример с классами падежей, где отсутствие этого вывода является проблемой.

Рассмотрим следующую иерархию классов дел:

sealed trait Person[+T <: Person[T]]
case class Student() extends Person[Student]
case class Professor() extends Person[Professor]

Мне нужно определить класс делаUniversity который я могу создать с помощью переменной типаPerson[_], напримерval p: Person[_] = Student(), Я думал, что это будет работать со следующим определением:

case class University(p: Person[_])

Но это не скомпилируется с ошибкой:

type arguments [Any] do not conform to trait Person's type parameter bounds [+T <: Person[T]]

Если я связываю параметр типа класса caseUniversity он компилируется (он также компилируется с неограниченными параметрами, если я опускаюcase ключевое слово, но это не вариант в моем случае):

case class BoundUniversity[P <: Person[P]](p: Person[P])

Но эту параметризованную версию нельзя создать с помощью неограниченной переменной типаPerson[_]:

val p: Person[_] = Student()
BoundUniversity(p)

не компилируется с:

inferred type arguments [_$1] do not conform to method apply's type parameter bounds [P <: Person[P]]

Та же ошибка происходит для метода со связанным аргументом, например:

def general[P <: Person[P]](p: P) = println(p)

так что это не относится к конструкторам классов.

Два вопроса:

  1. The type Person is defined with parameter bounds Person[+T <: Person[T]], so that each instance of this type is insured to respect those bounds: val p: Person[P] implies that P <: Person[P]; or am I missing something? So how can I make this clear to the compiler so that it doesn't complain?

  2. How/Can I define a case class with members with unbound type parameter like case class University(p: Person[_])?

  • Error: User Rate Limit ExceededUniversityError: User Rate Limit ExceededPersonError: User Rate Limit Exceeded

    от Julien Gaugaz
  • Error: User Rate Limit Exceededval p: Person[_] = Student(); University(p)Error: User Rate Limit ExceededPerson[_]Error: User Rate Limit ExceededList[Person[_]](Student(), Professor())Error: User Rate Limit ExceededList(Student(), Professor())Error: User Rate Limit Exceeded

    от Julien Gaugaz
  • Error: User Rate Limit ExceededscalacError: User Rate Limit ExceededPerson[(some other)_1(in method equals)] where type (some other)_1(in method equals) <: schemdesc.hierarchy.eval.Person[_0]Error: User Rate Limit ExceededPerson[_ <: schemdesc.hierarchy.eval.Person[_0]]

    от Julien Gaugaz
  • Error: User Rate Limit ExceededPerson[_]Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceededabstract typesError: User Rate Limit Exceededpretty much invariant.

    от leedm777
  • Error: User Rate Limit ExceededTError: User Rate Limit Exceeded

    от Julien Gaugaz
  • Есть лиTError: User Rate Limit Exceeded

    от leedm777
  • 2

    Тип

    X[_]Error: User Rate Limit Exceeded_Error: User Rate Limit Exceeded

    Error: User Rate Limit Exceeded

    case class University(p: Person[t] forSome { type t <: Person[t] })