号は、Scalaでのみ可能であると形質は同じクラスに2回混ぜられません直接。 2つの型が確実に一致するようにするには、通常、型パラメータを共変変数(+
)にする必要があります。
たとえば、これが許可されていません。
scala> trait A[+T] { def foo: T = sys.error() }
defined trait A
scala> class C extends A[AnyRef] with A[String]
<console>:8: error: trait A is inherited twice
class C extends A[AnyRef] with A[String]
しかし、これは次のとおりです。
scala> trait A[+T] { def foo: T = sys.error() }
defined trait A
scala> class C extends A[AnyRef]
defined class C
scala> class B extends C with A[String]
defined class B
ノートのC#の場合と同様に、この場合には、あなたがのオーバーロードセマンティクスを取得しないことしかしがセマンティクスをオーバーライドしている - 適合する署名を持つA
のすべてのメソッドは、ある特定の方法でもっとも特有の署名と融合され、 dをlinearization rulesに従ってください。
あなたがしたいことをScalaコードで記述することはできますか?ここの多くの人々はC#に精通していません。 – Jus12
さて、私はScala(学習しようとしています:)に精通しているわけではありません)。しかし、上記のコードは、Javaを知っている人にとっては理解しやすいはずです。この設定の「クラスC」の後の「:」はJavaの「実装」を意味します。私がScalaで試したことは、私を特性(単に "特性"と置き換える)にして、Cを "クラスCがIとI {..."で拡張するように定義することです。 。 –
Eyvind
Scalaでの一般的な型は '[]'で囲まれているので、 'I [Int]'と 'I [String]'として扱います。あなたは宣言で 'ClassManifest'を使ってみましたか? – Jus12