参考https://google.github.io/dagger/multibindings.html,有此代码
@AutoAnnotation
static MyKey createMyKey(String name, Class<?> implementingClass, int[] thresholds) {
return new AutoAnnotation_MyComponentTest_createMyKey(name, implementingClass, thresholds);
}
转换为Kotlin时,我在下面使用
companion object {
@AutoAnnotation
@JvmStatic
fun createMyKey(name: String, implementingClass: Class<*>, thresholds: IntArray): MyKey {
return AutoAnnotation_MainActivity_createMyKey(name, implementingClass, thresholds)
}
}
它仍然在抱怨
error: @AutoAnnotation method must be static
public final com.elyeproj.daggermultibinding.MyKey createMyKey(@org.jetbrains.annotations.NotNull()
^
无论有没有@JvmStatic
,我都无法正常工作。有什么解决的办法吗?
答案 0 :(得分:0)
以下对我有用。具有create key方法作为全局函数。
class HelloAutoAnnotations {
fun execute() {
println("HelloAutoAnnotations...")
DaggerMyComponent.create().myMap().forEach(::println)
}
}
@MapKey(unwrapValue = false)
private annotation class MyKey(val username: String, val password: String)
@Module
private class MyModule {
@Provides
@IntoMap
@MyKey(username = "user1", password = "T0gether")
fun providesUser(): String = "Rooney"
@Provides
@IntoMap
@MyKey(username = "user2", password = "T0gether")
fun provideUser(): String = "Doo"
}
@Component(modules = arrayOf(MyModule::class))
private interface MyComponent {
fun myMap(): Map<MyKey, String>
}
@AutoAnnotation
private fun createMyKey(username: String, password: String): MyKey {
return MyKeyCreator.createMyKey(username, password)
}
答案 1 :(得分:0)
根据文档:
在编译时不知道其键的地图
只有在编译时就知道地图的键,地图多重绑定才有效 时间,并可以在注释中表示。如果您的地图按键没有 符合这些约束,那么您将无法创建多边界地图,但是 您可以通过使用set multibindings绑定一组 然后可以将其转换为非多边界图的对象。
@Module
class MyModule {
@Provides @IntoSet
static Map.Entry<Foo, Bar> entryOne(...) {
Foo key = ...;
Bar value = ...;
return new SimpleImmutableEntry(key, value);
}
@Provides @IntoSet
static Map.Entry<Foo, Bar> entryTwo(...) {
Foo key = ...;
Bar value = ...;
return new SimpleImmutableEntry(key, value);
}
}
@Module
class MyMapModule {
@Provides
static Map<Foo, Bar> fooBarMap(Set<Map.Entry<Foo, Bar>> entries) {
Map<Foo, Bar> fooBarMap = new LinkedHashMap<>(entries.size());
for (Map.Entry<Foo, Bar> entry : entries) {
fooBarMap.put(entry.getKey(), entry.getValue());
}
return fooBarMap;
}
}
所以您也许应该尝试这种方法。