2017-02-06 15 views
0

誰かが以下のコードが機能しない理由を説明できますか?メソッドパラメータのジェネリック型の問題

scala> abstract class A[T] {} 
defined class A 

scala> class B {} 
defined class B 

scala> object C extends A[B] {} 
defined object C 

scala> def method(arg: A[Any]): Unit = {} 
method: (arg: A[Any])Unit 

scala> method(C) 
<console>:14: error: type mismatch; 
found : C.type 
required: A[Any] 
Note: B <: Any (and C.type <: A[B]), but class A is invariant in type T. 
You may wish to define T as +T instead. (SLS 4.5) 
     method(C) 

私はここにAという名前の、抽象クラスを持っている、と私は方法methodの引数として[AnythingHere]を拡張して何かを渡すことができるようにしたいと思います。 Javaではpublic void method(A<?> arg) {}と書いていますが、?がないので、Scalaでそれを動作させる方法がわかりません。

また、++Tに追加しようとしましたが、テストして検索した結果、ここでは役立たなかったと思います。ただ、警告が事前に

おかげ

+0

http://www.julien.richard-foy.fr/blog/2013/02/21/be-friend-with-covariance-and-contravariance/ – cchantep

答えて

3

あなたはScalaではバリアントまたは反変でジェネリックを使用したい場合は、明示的に宣言する必要があるため、コードは動作しませんが姿を消しました。それ以外の場合は、Java の不変のビヘイビアが実装されます。

Javaはデフォルトで不変です。つまり、A<Bの場合、List[A]List[B]には階層的な関係はありません。

Scalaは、その後List[A]<List[B]、その後、もしA<B場合、あなたは共変としてジェネリックを宣言すると

  1. を意味し、共変または反変としてジェネリック型を宣言し使用することができます。これを行うには、あなたが反変としてジェネリックを宣言する場合は、List[A]>List[B]、その後A<Bかの場合、構文class A[+T]
  2. を使用してジェネリックを宣言しなければなりません。これを行うには、あなたはおそらく、使用したい構文class A[-T]
+0

を参照してください。正しいコードの短い例を追加してください? – Nicofisi

+0

私はやっています...しばらくお待ちください:) –

+0

私が見る限り、 '+'は 'T'の後ろに置くことはできません。それは何か? 'scala> class D [T +] {} :1:エラー: ']'が必要ですが、識別子が見つかりました。 class D [T +] {} ' – Nicofisi

0

を使用してジェネリックを宣言する必要があります。def method[T](arg: A[T])

これは、クラス定義の分散を変更する必要がないことを意味します。

関連する問題