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 value
ele, pode ser aplicado a ele.
Eu acho que a principal diferença de Java que interface
você 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 é X
usada no construtor X 3 show
( show
é uma função que aceita argumentos de qualquer tipo que implementa Show
e 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 this
e 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.