問題タブ [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 - Scalaジェネリックの互換性を反射的に決定する
ターゲットの型 (たとえばList[String]
) とオブジェクト o が与えられた場合、目標は、ターゲットの型と互換性のある戻り値の型を持つ o のメソッドを見つけることです。
ジェネリックがない場合は、 from<:<
演算子 (Java の のスカラ リフレクション アナログ)を使用してメソッドのターゲット型と戻り値の型を比較することで、これを確認できます。isAssignableFrom
scala.reflect.runtime.universe
このアプローチは、ジェネリックが存在する場合には機能しません。たとえば、メソッドの戻り値の型が をdef getEmptyList[T]: List[T] = Nil
満たしていませんList[T] <:< List[String]
。getEmptyList[T]
の戻り値の型が実際に と互換性があることをどのように判断
しList[String]
ますか?
scala - 自己型が基本クラスに準拠していません
次のコードを使用します。
BasicHello
ケース クラスで IDE に次のエラーが表示されます。
BasicHello
extends以来Hello[BasicBaz]
、コンパイラがこれを許可しない理由がわかりませんBaz[BasicFoo, BasicBar]
。のタイプは、ミックスインが必要とするものとまったく同じであるBasicHello
必要があります。自己型に欠けている階層プロパティはありますか? Hello[Baz[Foo, Bar]]
World
scala - 共変型 FParam は、値推測の型 Seq[FParam] の反変位置で発生します
次の簡単な例を考えてみましょう。
コンパイルされません。
共変型は、値推測の
FParam
型の反変位置で発生します。Seq[FParam]
しかし seq は と定義されてtrait Seq[+A]
いるので、この反変性の原因は何でしょう? (質問1 )
逆に、次の単純な例を考えてみましょう-FParam
:
反変型は、型の共変位置で発生します
(FParam) => FRes
繰り返しますが、同じパラドックスです:Function1[-T1, R]
では、最初の型パラメーターは明らかに反変であるのに、なぜFParam
共変の位置にあるのでしょうか? (問2 )
Lower type boundsで説明されているように分散を反転することでこの問題を修正できますが、なぜそれが必要なのかは不明です。