例によるScalaの実存型とJavaのワイルドカードの違いは?
-
06-07-2019 - |
解決
これは、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の実在型のより一般的な概念。