Общее решение - ввести новый тип. Он может быть более сложным, но он имеет то преимущество, что работает с любым типом, который не определяет собственную бесконечность.
Если T
- это тип, для которого определен lteq
, вы можете определить InfiniteOr<T>
с lteq
примерно так:
class InfiniteOr with type parameter T:
field the_T of type null-or-an-actual-T
isInfinite()
return this.the_T == null
getFinite():
assert(!isInfinite());
return this.the_T
lteq(that)
if that.isInfinite()
return true
if this.isInfinite()
return false
return this.getFinite().lteq(that.getFinite())
Я оставлю вам переводить это на точный синтаксис Java. Надеюсь, идеи ясны; но позвольте мне все равно их изложить.
Идея состоит в том, чтобы создать новый тип, который имеет все те же значения, что и некоторый уже существующий тип, плюс одно специальное значение, которое, насколько вы можете судить с помощью общедоступных методов, действует точно так, как вы хотите, чтобы действовала бесконечность, например это больше, чем что-либо еще. Я использую null
для представления бесконечности здесь, поскольку это кажется наиболее простым в Java.
Если вы хотите добавить арифметические операции, решите, что они должны делать, а затем реализуйте это. Это, вероятно, проще всего, если вы сначала обрабатываете бесконечные случаи, а затем повторно используете существующие операции с конечными значениями исходного типа.
Может существовать или не существовать общий образец того, выгодно ли принять соглашение об обработке левосторонних бесконечностей перед правосторонними бесконечностями или наоборот; Я не могу сказать, не попробовав, но для «меньше или равно» (lteq
) я думаю, что проще сначала посмотреть на бесконечность в правой части. Замечу, что lteq
не коммутативен, но add
и mul
являются; возможно, это актуально.
Примечание: придумать хорошее определение того, что должно происходить с бесконечными значениями, не всегда легко. Это для сравнения, сложения и умножения, но, возможно, не для вычитания. Кроме того, существует различие между бесконечными количественными и порядковыми числами, на которые вы, возможно, захотите обратить внимание.
person
Jonas Kölker
schedule
08.07.2016
∞-∞==0
должно быть правдой? А также: Зачем вам такая вещь? - person brimborium   schedule 18.10.2012