存在タイプはインターフェイスとどのように異なりますか?


11

存在タイプを考える

T = X.{op₁:X, op₂:Xboolean}

この汎用Javaインターフェース:

interface T<X> {
    X op₁();
    boolean op₂(X something);
}

存在タイプとJavaインターフェースの基本的な違いは何ですか?

明らかに、構文上の違いとJavaのオブジェクト指向(隠されたthisパラメーターなどの詳細も含まれます)があります。概念的および意味的な違いほどこれらに興味はありませんが、誰かがより細かい点(Tvs. 間の表記上の違いなどT<X>)を明らかにしたい場合は、それも高く評価されます。


回答:


4

うーん...その定義は、私がずっと前に見たいくつかのhaskellサンプルに非常に似ています。

{-# 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]

コンストラクタXが適用されると、実際にはbecomesになります。取り出すvalueときは、タイプがわからず、空の操作セットがあることに注意してください。しかし、それviewValueとは首尾一貫しvalueているので、それに適用することができます。

interfaceあなたが提案したJavaの主な違いは、op₁toの結果を渡すための中間型を知っている必要があるという事実だと思いますop₂。つまり、実存型の適切なシステムは、条件によって存在することが保証されている適切な型を選択する必要があります。つまり、次のタイプの関数を作成できるはずです∀X. X→(X→boolean)→T。prevサンプルでは、​​このような関数は、でX使用されるコンストラクターですX 3 showshow実装Showして返す任意の型の引数を取る関数ですString

更新:質問を読み直しましたが、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₂()) ...

あなたは言及について正しいですthis-それは実際にはあなたの操作です。

だから、古典的なOOP言語(Java、C#、C ++など)は常に単一の値thisとその値で暗黙的に呼び出される「メソッド」と呼ばれるその上の関数で実在型を実装することを理解したと思います:)

PS申し訳ありませんが、私はJavaにあまり精通していませんが、あなたがアイデアを持っていることを願っています。


これに加えて、関数型プログラミングのサポートのためにJava 8で導入されているSingle Abstract Method(SAM)型を見てみたいと思うでしょう。
マーティンヴェルブルグ

2

唯一の違いは、Javaインターフェースは実際にはJavaコンパイラにとって何かを意味するということです。

存在タイプは、あらゆる言語に固有ではないタイプの正式な定義です。コンピューター科学者は、この種の定義を使用して、型とそれを実装する言語に関することを証明します。Javaインターフェースは、正式に定義されたタイプのJavaの実装の1つです。


いや。ウィリアムクックペーパーを参照してください。
ニコラス14

2

提示された2つのタイプは互いに大きく異なります。作成したインターフェース定義は、汎用タイプです(一般的にJavaジェネリックはこのカテゴリに分類されます)。

存在型は、その実装内の型をコンシューマから隠します。直観的には、XがTに存在するためには、Xのアイデンティティはどの消費者からも知ることができません。知っておくべきことは、定義時に提供される一連の操作だけです。一部のタイプXに対して1つのタイプTが存在します。

対照的に、ユニバーサルタイプは、消費者が自由に選択できるすべてのタイプに適用可能な操作を定義します。インターフェイスタイプTはまさにそれです。Xは消費者によってインスタンス化され、消費者はどのタイプXかを正確に知っています。ユニバースのすべてのタイプXにタイプTが存在します。

ワイルドカード(List<?>)の限られた場合を除いて、実在物は実際にはJavaに言語構造として存在しません。ただし、はい、インターフェイスでエミュレートできます。その場合、問題はより多くの設計になります。

ただ指摘したように、オブジェクト指向の設定では、Xの型情報(それでできること)を通常エンコードする方法は、Xが実装するインターフェース型にメンバー関数を持たせることなので、実存は実装するのが難しくなります。要するに、インターフェイスはいくつかのタイプの抽象化機能を購入できますが、実在性をある程度排除する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.