在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中实现这一点?
谢谢
答案 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" }
因此,Int
或String
只是通用参数的 NAME 。它也可以是A
和B
,但你只是让自己感到困惑。
完成此操作后,您知道自己知道FooImpl1
和FooImpl2
。
它们需要不同的名称,因为在同一范围内不能有两个相同的类!
这很好。因为当你:
bind(classOf[X]).to(classOf[Y])
您告诉我们,当您的班级调用Interface
或Trait
X
的方法时,您希望提供班级Y
的实施。
您必须提供可以实例化的课程!您无法使用泛型参数实例化类。
而且,要完成,你的正确绑定将如下所示:
bind(new TypeLiteral[Foo[Int]](){}).to(classOf[FooImpl1])
bind(new TypeLiteral[Foo[String]](){}).to(classOf[FooImpl2])