Проверенная дисперсия исключений

Java поддерживает Checked Exceptions, но по умолчанию является инвариантным на сайте объявления. Scala допускает аннотации вариантов с использованием +T и -T, но не имеет проверенных исключений. В настоящее время я разрабатываю/внедряю язык, который должен поддерживать оба, поэтому мне интересно, как работает дисперсия для проверенных исключений.

Пример:

interface Function[-P1, +R, E]
{
    public R apply(P1 par1) throws E
}

Какая аннотация дисперсии должна быть у E или она неизменна? И, кроме того, должен ли я генерировать ошибку, если она имеет противоположную аннотацию дисперсии, подобно тому, как в Scala вы получаете ошибку, если используете аргумент ковариантного типа в качестве типа параметра функции?


person Clashsoft    schedule 01.07.2015    source источник


Ответы (1)


Подобные вещи возникают постоянно при проектировании языка, и есть проблемы с надежностью и т. д., поэтому найдите время, чтобы подумать об этих проблемах в других аспектах языка!

Но, в любом случае, решать вам, что это значит. Предположим, у нас есть

interface IOFunction[-P1, +R, E <: IOException] extends Function[P1,R,E]

и тогда у нас есть метод

public R doIo[P1, R](f: IOFunction[P1, R, IOException]) ...

Что, если у пользователя есть функция, которая выдает только MyIOException <: IOException? Должны ли они быть в состоянии использовать его?

Если да, то это и есть ковариация. Если нет, это должно быть именно IOException или ничего, тогда используйте инвариантность.

Вы можете использовать те же рассуждения для исключений, что и для обычного возвращаемого значения. Они являются своего рода возвращаемым значением, но не обычным.

person Rex Kerr    schedule 01.07.2015
comment
Что ж, это забавный язык, который вырос до 90k LoC... не имеет. Но все равно спасибо за ответ, хотя последнего предложения было бы достаточно. - person Clashsoft; 02.07.2015
comment
@Clashsoft - да, я думаю, к нему следует относиться так же, как к возвращаемому типу. - person ZhongYu; 02.07.2015
comment
@Clashsoft - Возможно, но тогда возникает соблазн просто скопировать возвращаемые значения (то есть ковариантные), а не думать о компромиссах. - person Rex Kerr; 02.07.2015