Scala依赖注入与泛型类

时间:2017-07-14 20:05:27

标签: java scala dependency-injection guice

在Scala中使用Guice,我尝试重现以下Java代码。

Foo接口和类声明:

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) {}

在斯卡拉,我的第一个赌注是:

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

但它抱怨&#39; Type Foo采用类型参数&#39; 我如何在scala中实现这一点?

谢谢

1 个答案:

答案 0 :(得分:1)

您的问题有错误,因此您的回答错误。

让我们首先解决您的概念。有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" }

他们不能:

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

因此,IntString只是通用参数的 NAME 。它也可以是AB,但你只是让自己感到困惑。

完成此操作后,您知道自己知道FooImpl1FooImpl2。 它们需要不同的名称,因为在同一范围内不能有两个相同的类!

这很好。因为当你:

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

您告诉我们,当您的班级调用InterfaceTrait X的方法时,您希望提供班级Y的实施。

必须提供可以实例化的课程!您无法使用泛型参数实例化类。

而且,要完成,你的正确绑定将如下所示:

bind(new TypeLiteral[Foo[Int]](){}).to(classOf[FooImpl1])
bind(new TypeLiteral[Foo[String]](){}).to(classOf[FooImpl2])