Система типов, не допускающая подтип как конструктор типов

Для gcc 6 и выше произошло связанное исправление ошибок:

С помощью gcc 5 вы также можете получить такое же предупреждение, не включая iostream.

Итак, если вы видите аналогичное предупреждение, относящееся к dl-init.c, и вы используете gcc 5, рассмотрите обновление до более новой версии (gcc> = 6) или попытайтесь скомпилировать с clang.

0
задан summerbulb 2 March 2019 в 21:39
поделиться

1 ответ

SportsCar - это не CarLike[String, SportsCar], это CarLike[String, SimpleCar[String]]. Обратите внимание, что SportsCar extends SimpleCar[String], но это не помогает, поскольку CarLike не является ковариантным в C.

Вы не можете сделать ковариантным CarLike в C, так как его метод crash принимает C. Вместо этого вы можете передать SimpleCar[String] в Crasher (в конце концов, спортивные машины могут разбиться на других машинах, верно?):

val crasher = Crasher[String, SimpleCar[String]](
  s => s.tail,
  c => c.parts.filter(p => p.length > 0)
)

Или вы можете изменить Crasher, чтобы получить другой параметр типа :

case class Crasher[T, C <: CarLike[T, C], X <: C](partsDamager: T => T,
                                                  carChecker: X => Seq[T]) {
  // ...
}

val crasher = Crasher[String, SimpleCar[String], SportsCar](
  s => s.tail,
  c => c.parts.filter(p => p.length > 0)
)
0
ответ дан Brian McCutchon 2 March 2019 в 21:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: