kotlin集合的guice typeliteral(例如kotlin.collections.iterable)搜索java.lang.iterable

eoxn13cs  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(301)

问题

在kotlin中,使用以下guice模块配置

fun configureFoo(binder: Binder) {
  binder.bind(object: TypeLiteral<Foo<Iterable<Any>>>() {}).to(MyFoo::class.java)
}

以及示例类

interface Foo<T> {
  // ...
}

class MyFoo : Foo<Iterable<Any>> {
  // ...
}
class User @Inject constructor(foo: Foo<Iterable<Any>>) {
  // ...
}

我得到guice配置错误:

No implementation for Foo<java.lang.Iterable<Any>> was bound. ...

我试过的

我可以通过改变 Iterablejava.lang.Iterable 到处都是。。。但这是一个糟糕的解决方法,失去了 kotlin.collections.Iterable .

问题

有人知道这个问题并有更好的解决方法吗?

2w3kk1z5

2w3kk1z51#

简单的解决方法,直到找到更好的解决方案

现在我正在使用一个解决方法,如下所示,以防有人偶然发现这个问题:
我定义专业化 MultiFoo<Any> 使用它们代替 Foo<Iterable<Any>> 每当我想为foo使用iterable类型参数时:

fun configureFoo(binder: Binder) {
  // bind an iterable Any for Foo
  binder.bind(object: TypeLiteral<MultiFoo<Any>>() {}).to(MyFoo::class.java)

  // bind a single Any For Foo
  binder.bind(object: TypeLiteral<Foo<Any>>() {}).to(MySingleFoo::class.java)
}
interface Foo<T> {
  // ...
}
interface MultiFoo<T>: Foo<Iterable<T>> {
  // ...
}

class MyFoo : MultiFoo<Any> {
  // ...
}

class MySingleFoo : Foo<Any> {
  // ...
}
class User @Inject constructor(foo: MultiFoo<Any>, bar: Foo<Any>) {
  // ...
}

虽然为注入绑定和构造函数参数创建和使用额外的类不是很漂亮,但至少注入的类遵循所需的接口约定。。。我可以用 MultiFoo<Any> 作为一个 Foo<Iterable<Any>>

相关问题