2011-09-27 16 views
12

次のような一般的なインターフェイスが与えられたScalaのジェネリックス:インターフェイス/特性を2回実装する?

interface I<T> { 
    void m(T t); 
} 

私はC#でIを2回以上実装することができます。

class C : I<int>, I<String> { 
    public void m(int i) { } 
    public void m(String s) { } 
} 

ジェネリック型の情報が消去されるため、これはJavaではできませんが、Scalaではこれを実現できますか?

+0

あなたがしたいことをScalaコードで記述することはできますか?ここの多くの人々はC#に精通していません。 – Jus12

+0

さて、私はScala(学習しようとしています:)に精通しているわけではありません)。しかし、上記のコードは、Javaを知っている人にとっては理解しやすいはずです。この設定の「クラスC」の後の「:」はJavaの「実装」を意味します。私がScalaで試したことは、私を特性(単に "特性"と置き換える)にして、Cを "クラスCがI とI {..."で拡張するように定義することです。 。 – Eyvind

+0

Scalaでの一般的な型は '[]'で囲まれているので、 'I [Int]'と 'I [String]'として扱います。あなたは宣言で 'ClassManifest'を使ってみましたか? – Jus12

答えて

12

号は、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に従ってください。

10

いいえ、できません。形質(インターフェイス)が互いにを適合種類のパラメータ化される2種類の場合は、一般的に私はこのケースで行う、同じ形質に混合

class C { 
    object IInt extends I[Int] { ... } 
    object IString extends I[String] { ... } 
    ... 
} 
関連する問題