Hmm ... Essa definição se parece muito com uma amostra de haskell que eu já vi há muito tempo.
{-# 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 o construtor Xé aplicado, ele se torna realmente. Observe que, quando você retira value, não conhece o tipo e possui um conjunto de operações vazio sobre ele. Mas já que viewValueé meio coerente com valueele, pode ser aplicado a ele.
Eu acho que a principal diferença de Java que interfacevocê propôs é o fato de que você precisa conhecer o tipo intermediário para passar o resultado de op₁para op₂. Ou seja, o sistema adequado para o tipo existencial deve selecionar o tipo certo que é garantido que existe por condição. Ou seja, você deve ser capaz de escrever a função com o tipo: ∀X. X→(X→boolean)→T. Na amostra anterior, essa função é Xusada no construtor X 3 show( showé uma função que aceita argumentos de qualquer tipo que implementa Showe retorna String)
Atualizado: Acabei de reler sua pergunta e acho que tenho uma construção adequada para 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₂()) ...
Você está certo sobre mencionar this- na verdade é sua opção.
Então, acho que entendi agora que linguagens clássicas de POO (Java, C #, C ++ etc.) sempre implementam tipo existencial com valor único thise uma função chamada "métodos", chamada implicitamente com esse valor :)
PS Desculpe, não estou muito familiarizado com Java, mas espero que você tenha entendido.