Java поддерживает Checked Exceptions, но по умолчанию является инвариантным на сайте объявления. Scala допускает аннотации вариантов с использованием +T
и -T
, но не имеет проверенных исключений. В настоящее время я разрабатываю/внедряю язык, который должен поддерживать оба, поэтому мне интересно, как работает дисперсия для проверенных исключений.
Пример:
interface Function[-P1, +R, E]
{
public R apply(P1 par1) throws E
}
Какая аннотация дисперсии должна быть у E
или она неизменна? И, кроме того, должен ли я генерировать ошибку, если она имеет противоположную аннотацию дисперсии, подобно тому, как в Scala вы получаете ошибку, если используете аргумент ковариантного типа в качестве типа параметра функции?