gpt4 book ai didi

java - 使用泛型类进行 Scala 依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-02 02:43:01 34 4
gpt4 key购买 nike

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

Foo 接口(interface)和类声明:

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

Guice绑定(bind)代码:

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

一个使用示例是;

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

在 scala 中,我的第一个赌注是:

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

但它提示“Type Foo 采用类型参数”我如何在 scala 中实现这一点?

谢谢

最佳答案

您的问题有错误,因此您可能会得到错误的答案。

让我们首先确定您的概念想法。具有特质

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)如下所示:

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

关于java - 使用泛型类进行 Scala 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45110815/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com