scala依赖注入与泛型类

p1tboqfb  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(456)

使用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])

但它抱怨“type foo takes type parameter”,我如何在scala中实现这一点?
谢谢您

qyzbxkaa

qyzbxkaa1#

你的问题有一个错误,因此它让你得到一个错误的答案。
让我们先确定你的概念。有 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` 只是泛型参数的名称。也可能是 `A` 以及 `B` ,但你把自己搞糊涂了。
解决了这个问题,你知道你 `FooImpl1` 以及 `FooImpl2` . 它们需要不同的名称,因为在同一范围内不能有两个名称相同的类!
一切都很好。因为当你:

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

你说的是每当你的类调用 `Interface` 或者
Trait `X` 您想提供类的实现 `Y` .
必须提供一个可以示例化的类!不能用泛型参数示例化类。
最后,正确的装订方式如下:

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

相关问题