Общее решение состоит в том, чтобы ввести новый тип. Он может быть более сложным, но имеет преимущество работы с любым типом, который не определяет свою бесконечность.
Если 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
являются; может быть, это актуально.
Примечание: придумать хорошее определение того, что должно происходить с бесконечными значениями, не всегда легко. Это для сравнения, сложения и умножения, но, возможно, не вычитания. Кроме того, существует различие между бесконечными кардинальными и порядковыми числами, на которые вы можете обратить внимание.