Hmm ... Định nghĩa đó trông rất giống với một số mẫu haskell mà tôi đã thấy từ lâu.
{-# 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]
Khi constructor Xđược áp dụng ∀ thực sự trở thành ∃. Lưu ý rằng khi bạn lấy ra, valuebạn không biết loại và có bộ hoạt động trống trên nó. Nhưng vì viewValuenó phù hợp với valuenó có thể được áp dụng cho nó.
Tôi đoán sự khác biệt chính của Java interfacemà bạn đề xuất là thực tế là bạn phải biết loại trung gian để truyền kết quả op₁cho op₂. Tức là hệ thống thích hợp cho loại tồn tại nên chọn đúng loại được đảm bảo tồn tại theo điều kiện. Tức là bạn sẽ có thể viết hàm với loại : ∀X. X→(X→boolean)→T. Trong mẫu trước, hàm như vậy là hàm Xtạo được sử dụng trong X 3 show( showlà hàm lấy đối số của bất kỳ kiểu nào thực hiện Showvà trả về String)
Đã cập nhật: Tôi vừa đọc lại câu hỏi của bạn và tôi nghĩ rằng tôi đã xây dựng đúng cho 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₂()) ...
Bạn đã đúng khi đề cập this- thực sự đó là op của bạn.
Vì vậy, tôi đoán bây giờ tôi đã hiểu rằng các ngôn ngữ OOP cổ điển (Java, C #, C ++, v.v.) luôn thực hiện kiểu tồn tại với một giá trị duy nhất thisvà một hàm trên nó được gọi là "phương thức" được gọi ngầm với giá trị đó :)
PS Xin lỗi, tôi không quen thuộc lắm với Java, nhưng tôi hy vọng bạn đã có ý tưởng.