2017-07-14 20 views
0

ScalaのGuiceを使用して、次のJavaコードを再現しようとしています。Scalaジェネリッククラスの依存関係注入

フー・インターフェースとクラス宣言:

public interface Foo[T] {} 
public class FooImpl[T] implements Foo[T] {} 

Guiceの結合コード:

bind(Foo.class).to(FooImpl.class); 

そして、もう一つの使用例であろう。

@Inject 
public class Bar(Foo<String> foo) {} 

はScalaで、私の最初の賭けでした:

bind(classOf[Foo]).to(classOf[FooImpl]) 

しかし、それは私がScalaでこれを達成するにはどうすればよい 'Foo型は、パラメータを入力とり' 不満ですか?

+0

どのように 'バインド(classOf [フー])について。こんにちはDima、あなたの答えをありがとう。(FooImpl ) ' – frozen

+1

' bind(classOf [Foo [_]])。(classOf [FooImpl [_]]) ' – Dima

+0

それは動作しているように見えますが、私は別の問題に直面しているので、今すぐ確認することができません。クラスに2つの暗黙的なパラメータがあり、Guiceと注入を使用して正しく提供されていないように見えます。それがうまくいけば、私はそれで私の質問に答えることができるようにあなたに知らせます。 – Jeep87c

答えて

0

あなたの質問にエラーがあるありがとうので、それは間違った答えのためにあなたを可能にします。

最初にコンセプトのアイデアを修正しましょう。だけで正常に動作し

trait

trait Foo[T] { def hello: T } 
を持ちます。

class FooImpl1 extends Foo[Int] { override def hello: Int = 42 } 
class FooImpl2 extends Foo[String]{ override def hello: String = "test" } 

そして彼らはないかもしれない:しかし、その後、この特性を拡張する特定のクラスは、FEになり、その後、IntまたはStringがためだけNAMEあるので

class FooImpl[Int] extends Foo[Int] { override def hello: Int = 42 } 
class FooImpl[String] extends Foo[String]{ override def hello: String = "test" } 

ジェネリックパラメータABでもかまいませんが、あなたは混乱してしまいました。これは整理持つ


、あなたはFooImpl1FooImpl2を持っていることを知っている知っています。 同じスコープ内で同じ名前の2つのクラスを持つことができないため、それらは異なる名前を必要とします。

これは問題ありません。ので、あなたがするとき:

bind(classOf[X]).to(classOf[Y]) 

あなたのクラスがInterfaceまたはTraitXのメソッドを呼び出すたびにクラスYの実装を提供したいと言っています。

には、インスタンス化できるクラスが用意されています。ジェネリックパラメータでクラスをインスタンス化することはできませんでした。

そして、終了する、あなたの適切な結合は次のようになります。

bind(new TypeLiteral[Foo[Int]](){}).to(classOf[FooImpl1]) 
bind(new TypeLiteral[Foo[String]](){}).to(classOf[FooImpl2]) 
関連する問題