Hmm ... Cette définition ressemble beaucoup à un échantillon de haskell que j'ai vu il y a longtemps.
{-# LANGUAGE ExistentialQuantification #-}
data X = forall a . X { value :: a, viewValue :: a -> String }
instance Show X where show (X { value = x, viewValue = f}) = f x
sample :: [X]
sample = [X 3 show, X "abc" show, X 3.14 show]
Lorsque le constructeur Xest appliqué, becomes devient en fait ∃. Notez que lorsque vous sortez, valuevous ne connaissez pas le type et avez un ensemble d'opérations vide dessus. Mais comme il viewValueest un peu cohérent, valueil peut lui être appliqué.
Je suppose que la principale différence de Java que interfacevous avez proposée est le fait que vous devez connaître le type intermédiaire pour passer le résultat de op₁à op₂. C'est-à-dire que le système approprié pour le type existentiel doit sélectionner le bon type qui est garanti d'exister par condition. -À- dire , vous devriez être en mesure d'écrire la fonction de type: ∀X. X→(X→boolean)→T. Dans l'exemple précédent, cette fonction est le Xconstructeur utilisé dans X 3 show( showest la fonction qui prend l'argument de tout type qui implémente Showet renvoie String)
Mise à jour: je viens de relire votre question et je pense que j'ai une bonne construction pour Java:
interface T {
boolean op₂();
}
...
T x = new T() {
private final int op₁ = ...;
public boolean op₂() { return ((op₁ % 2) == 0); }
};
T y = new T() {
private final char op₁ = ...;
public boolean op₂() { return ('0' <= op₁ && op₁ <= '9'); }
};
if (x.op₂() && y.op₂()) ...
Vous avez raison de mentionner this- c'est en fait votre op₁.
Donc je suppose que j'ai compris maintenant que les langages OOP classiques (Java, C #, C ++ etc) implémentent toujours un type existentiel avec une valeur unique thiset une fonction dessus appelée "méthodes" qui implicitement appelées avec cette valeur :)
PS Désolé, je ne suis pas très familier avec Java, mais j'espère que vous avez l'idée.