Непроверенное предупреждение об генериках в Scala? - PullRequest
1 голос
/ 26 февраля 2011

Я написал класс / объект NaturalComparator на Java и переписал его в Scala: https://gist.github.com/319827#file_natural_comparator.scala

Однако мне интересно, почему мне не нужен @SuppressWarnings ("unchecked") в Scalaверсия.(Я компилирую это fsc -deprecation -unchecked NaturalComparator.scala.)

  • Достаточно ли Scala достаточно, чтобы признать, что преобразование в порядке?
  • Предполагает ли компиляция Scala, что я знаю, что делаю, когдаЯ использую дженерики в .asInftanceOf[...]?

1 Ответ

4 голосов
/ 26 февраля 2011

Скала предполагает, что вы знаете, что делаете.В этом случае вы делаете знаете, что делаете, потому что даже если Comparator не помечен как контравариантный, он действует так, как если бы он был (т.е. если вы можете сравнить Any с Any,несомненно, вы можете сравнить T с T для какого-то конкретного T).

Если вы не знаете, что делаете, это может привести к ошибке времени выполнения.

Как правило, можно использовать сопоставление с образцом в случаях, подобных этому:

def cast[T](x: Any) = x match {
  case t: T => t
  case _ => throw new Exception
}

, и теперь вы определенно получаете предупреждение без проверки: поскольку T стирается, совпадение не делает то, что вы думаете, оно делает.

...