Узагальненим рішенням є впровадження нового типу. Це може бути більше залученим, але це має перевагу працювати для будь-якого типу, який не визначає власну нескінченність.
Якщо 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
для представлення нескінченності, оскільки це здається найпростішим на Яві.
Якщо ви хочете додати арифметичні операції, вирішіть, що вони повинні робити, то реалізуйте це. Це, мабуть, найпростіше, якщо спочатку обробити нескінченні випадки, а потім повторно використовувати існуючі операції на кінцевих значеннях оригінального типу.
Може існувати загальна закономірність того, чи корисно приймати конвенцію поводження з лівими сторонами перед нескінченностями правого боку чи навпаки; Я не можу сказати, не спробувавши це, але для менших рівних ( lteq
) я думаю, що простіше спочатку подивитися на нескінченність праворуч. Зауважу, що lteq
це не комутативно, але add
іmul
є; можливо, це актуально.
Примітка: придумати чітке визначення того, що має відбуватися з нескінченними значеннями, не завжди легко. Це для порівняння, додавання та множення, але, можливо, не віднімання. Також існує розмежування нескінченних кардинальних і порядкових чисел, на які ви можете звернути увагу.