Une solution générique consiste à introduire un nouveau type. Il est peut-être plus compliqué, mais il a l'avantage de fonctionner pour tout type qui ne définit pas sa propre infinité.
Si T
est un type pour lequel lteq
est défini, vous pouvez définir InfiniteOr<T>
avec lteq
quelque chose comme ceci:
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())
Je vous laisse le soin de traduire cela dans la syntaxe Java exacte. J'espère que les idées sont claires; mais laissez-moi les épeler de toute façon.
L'idée est de créer un nouveau type qui a toutes les mêmes valeurs que certains types déjà existants, plus une valeur spéciale qui - pour autant que vous puissiez en juger par les méthodes publiques - agit exactement comme vous voulez que l'infini agisse, par exemple, il est supérieur à rien d'autre. J'utilise null
pour représenter l'infini ici, car cela semble le plus simple en Java.
Si vous souhaitez ajouter des opérations arithmétiques, décidez de ce qu'elles doivent faire, puis implémentez-la. C'est probablement plus simple si vous gérez d'abord les cas infinis, puis réutilisez les opérations existantes sur des valeurs finies du type d'origine.
Il pourrait ou non y avoir un modèle général pour savoir s'il est avantageux ou non d'adopter une convention de gestion des infinis de gauche avant les infinis de droite ou vice versa; Je ne peux pas dire sans l'essayer, mais pour moins que ou égal ( lteq
), je pense qu'il est plus simple de regarder d'abord l'infini de droite. Je note que ce lteq
n'est pas commutatif, mais add
et mul
sont; c'est peut-être pertinent.
Remarque: trouver une bonne définition de ce qui doit se passer sur des valeurs infinies n'est pas toujours facile. C'est pour la comparaison, l'addition et la multiplication, mais peut-être pas la soustraction. En outre, il existe une distinction entre les nombres cardinaux et ordinaux infinis auxquels vous voudrez peut-être faire attention.