質問

スタックオーバーフローの質問よりも少し具体的な 存在タイプとは 、Scalaの existential types とJavaの wildcard の違いは何ですか?

これまで見てきたすべてにおいて、それらはほぼ同等のようです。

いくつかの参照。 Martin Odersky メンション; Googleの質問のトップヒット

  

MO:オリジナルのワイルドカードデザインは、実存型に触発されました。実際、元の論文には実存型のエンコーディングがありました。しかし、実際の最終設計がJavaで出てきたとき、この接続は少し失われました

役に立ちましたか?

解決

これは、Scala-usersメーリングリストでのMartin Oderskyの回答です。

  

元のJavaワイルドカードタイプ(ECOOP論文で説明されているとおり)   五十嵐とViroli)は実に実存の略語でした   タイプ。 Wild FJに関するFOOL '05の論文を読んだことがあります。   ワイルドカードの最終バージョンには、次のような微妙な違いがあります   存在タイプ。どんな意味で正確に知りません   形式主義は、古典的な実存型からあまりにも遠く離れている   違いを正確に特定することができます)、しかし、おそらく野生の慎重な読書   FJ論文はそれに光を当てるでしょう。

そのため、Scalaの実存型とJavaワイルドカードは同等のもののようです

他のヒント

これらは主な目的がJavaのワイルドカードと対話するため、同等であると想定されています。

これらは非常に似ていますが、Scalaの実存型はより強力なはずです。たとえば、Scalaの実存型は上限と下限の両方を指定できますが、Javaのワイルドカードは上限しか指定できません。

たとえば、Scalaの場合:

scala> def foo(x : List[_ >: Int]) = x
foo: (x: List[_ >: Int])List[Any]

fooは、Intの下限を持つパラメーターのリストを取ります。

Martin Oderskyによるより詳細な回答(残りはこちら):

  

Scalaは、本質的に3つのことのために存在型を必要とします。最初   Javaのワイルドカードを理解する必要があるということです。   存在型は、私たちがそれらを作る意味です。二つ目は   また、Javaの生の型を理解する必要があります。   まだライブラリにある、非修飾型。 Java rawを取得する場合   java.util.Listなどのタイプは、あなたが知らないリストです   要素タイプ。また、Scalaでは実存によって表現することもできます   タイプ。最後に、何が起こるかを説明する方法として実存型が必要です   Scalaの高レベルのVMでオン。 Scalaは消去モデルを使用します   Javaのようにジェネリックを使用するため、型パラメーターは表示されません   もうプログラムが実行されるとき。私たちは必要なので消去をしなければなりません   Javaと相互運用します。しかし、その後、反射を行うとどうなりますか   またはVMで何が起こっているかを表現したいですか?できる必要がある   Scalaにある型を使用してJVMが行うことを表します。   存在型はそれを可能にします。彼らはあなたがタイプについて話すことができます   これらのタイプの特定の側面がわかりません。

List [_] 表記(他の回答で指摘されているように、Javaの List [?] に類似した強力な表記法)は、 Scalaの実在型のより一般的な概念

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top