Hmm ... Quella definizione sembra molto simile a qualche esempio di haskell che ho visto molto tempo fa.
{-# 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]
Quando Xsi applica il costruttore ∀ diventa effettivamente ∃. Si noti che quando si estrae valuenon si conosce il tipo e si dispone di un set di operazioni vuoto su di esso. Ma poiché viewValueè un po 'coerente con valueesso può essere applicato ad esso.
Immagino che la principale differenza di Java che interfacehai proposto sia il fatto che devi conoscere il tipo intermedio per passare il risultato di op₁a op₂. Cioè il sistema adeguato per il tipo esistenziale dovrebbe selezionare il tipo giusto che è garantito per esistere dalla condizione. Per esempio, si dovrebbe essere in grado di scrivere la funzione con il tipo: ∀X. X→(X→boolean)→T. Nel campione precedente tale funzione è Xutilizzata dal costruttore X 3 show( showè la funzione che accetta argomenti di qualsiasi tipo che implementa Showe restituisce String)
Aggiornato: ho appena riletto la tua domanda e penso di avere una costruzione adeguata per 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₂()) ...
Hai ragione a menzionare this- in realtà è la tua opera.
Quindi immagino di aver capito ora che i linguaggi OOP classici (Java, C #, C ++ ecc.) Implementano sempre un tipo esistenziale con un singolo valore thise una funzione su di esso chiamata "metodi" che implicitamente chiamava con quel valore :)
PS Siamo spiacenti, non ho molta familiarità con Java, ma spero che tu abbia avuto l'idea.