問題タブ [scala-generics]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - Option defers ClassCastExceptionでジェネリックメソッド呼び出しをラップするのはなぜですか?
次のような配列があるとしましょう*:
明らかな理由で失敗します:
次に、次のクラスを考えてみましょう。
私が知る限りgetAs
、前の のapply
後にasInstanceOf
.
驚くべきことに、そうではありません。単独で呼び出すと、例外がスローされます。
しかし、ラップされた場合はOption
成功します:
ラップされた値にアクセスしようとした場合にのみ失敗します:
それで、ここで何が起こりますか?制限されているように見えるClassCastException
ので、型消去のような醜いものに関連していると思います。
*サード パーティのコードの動作を模倣するためAny
にasInstanceOf
存在するので、それについて詳しく説明しないでください。
** Scala 2.10.5、2.11.7 でテスト済み
*** コンテキストに興味がある場合は、Using contains in scala - exception を参照してください。
**** コメントにリンクされているその他の関連する質問:
scala - Scala コレクションの一般的な拡張
私は持っていSeq[(A, B)]
ます。.toMultiMap
そのようなコレクションに暗黙的なメソッドを追加して、 を取得できるようにしたかったのMap[A, Seq[B]]
です。
これは私の最初の試みでした:
しかし、今の問題はTraversable
、値に対して常に a が返されることです。Map[A, Set[B]]
もしそうなら、私は元に戻したいですSet[(A, B)].toMultiMap
。
それで、私は次のようなことを試しました:
しかし、それは機能しません:
これを行う方法は何ですか?
scala - Scala-共分散
共分散の定義によると:
Q[+B] は、Q が任意のクラスを取ることができることを意味しますが、A が B のサブクラスである場合、Q[A] は Q[B] のサブクラスと見なされます。
次の例を見てみましょう。
List1[SomeB]
すべて問題ありませんが、なぜのサブクラスなList1[SomeA]
のか、つまりなぜ b が のサブクラスなのa
かわかりません。
scala - scala のジェネリック抽象型のパターン マッチング
私は自己再帰型を持っています:
今、私はでパターンマッチしたいですP#Solution
。内にいると仮定しましょうcase class Foo[P <: Problem[P]]()
:
もちろん、型消去のために失敗します。そのコードをscalaでコンパイルする方法はありますか?
class/type タグを見たことがありますが、そのような場合に使用できるかどうかはよくわかりません。
scala - Scala ケース クラスのみを受け入れるジェネリック クラスを定義する
Scala でジェネリック クラスを定義するとき、型パラメーター 'A' がケース クラスでなければならないことを確認するにはどうすればよいですか?
環境:
ケースクラスのコレクションであるかのように、reactivemongo JSONCollection と対話する汎用の 'TypedCollection' ラッパー クラスを定義しようとしています (リレーショナル データベースの Typesafe Slick に似ています)。
「A」がケース クラスでなければならない理由は、自動的に「unapply」メソッドが与えられるためです。このメソッドは、「A」型から JsObject または BSONObject への暗黙的な変換を作成するときにジェネリック クラスで使用されるため、MongoDB に格納できます。すなわち
scala - scala で型情報を渡す
このように定義されたクラス階層がある場合
sealed trait A
case class B() extends A
case class C() extends A
// and so on ..
そして別の場所で、上記のクラスを型としてその関数に動的に渡すメソッドを呼び出したい
(例: method[B](..){..} or method[C](..){..}
)
実行時にこれをどのように達成できますか?
java - Spark カスタム Hadoop 入力形式 Java ジェネリック エラー
mapreduce 時代の既存のカスタム入力形式を再利用するために Spark を評価しようとしているときに、Java ジェネリックの問題に遭遇しました。
上記により、myRdd で次のエラーが発生します
何が起こっているのかわからない。私は境界を満たしているように思えますか?私は問題を見つけることができませんか?
これは、呼び出されている scala コードです。