Основная функция N ков / контравариантность

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

class Person(name: String, val addr: Int) {
  def distance(that: Person) = this.addr - that.addr
}

class Employee(_name: String, role: String, _addr: Int) extends Person(_name, _addr) {
  def smgth = 1
}


val anna = new Employee("Anna", "Secretary", 1)
val boss = new Employee("Boss", "Boss", 2)


def filterP(l: List[Person]) = l filter { (x) => x.addr > 1 }
def fltrdEmployees(l: List[Employee]): List[Employee] = filterP(l)

который дает:

Error:(19, 65) type mismatch;
 found   : List[A$A126.this.Person]
 required: List[A$A126.this.Employee]
def fltrdEmployees(l: List[Employee]): List[Employee] = filterP(l);}
                                                           ^

Я понимаю, что это проблема с cov. Я видел, что cov-contra-дисперсия применяется к классам в классическом Box[T] пример.

Я также как-то осведомлен об объекте FunctionN

Как это исправить? Нужно ли мне обернуть материал в специальный объект, который выставляет мой желаемый метод? Есть ли что-то чище (и возможно) короче?

1 ответ

Решение

Вы можете исправить это, сделав filterP общий:

def filterP[T <: Person](l: List[T]) = l filter { (x) => x.addr > 1 }

Ковариация List это то, что позволяет вам поставлять List[Employee] где List[Person] требуется, однако проблема в том, что List[Person] возвращается, который не совместим с List[Employee], Сделав его универсальным, можно поддерживать тип элемента списка ввода.

Другие вопросы по тегам