无法为扩展 Java Class 的 class 注入列表 <String>
Cannot inject List<String> for class extending Java Class
尝试将字符串列表注入 class 构造函数时出现以下错误。我将 AbstractDelegator java class 扩展为 CancelDelegator。 AbstractDelegator 是从依赖项 jar 中引用的,所以我无法更改它。
No implementation for java.util.List<java.lang.String> annotated with @com.google.inject.name.Named(value=CANCEL_TASKS) was bound.
while locating java.util.List<java.lang.String> annotated with @com.google.inject.name.Named(value=CANCEL_TASKS)
for parameter 1 at com.cancel.core.delegator.CancelDelegator.<init>(CancelDelegator.kt:18).
at com.cancel.core.config.CancelModule.configure(CancelModule.kt:45)
以下是 classes:
AbstractDelegator.java(来自依赖 jar)
public abstract class AbstractDelegator<T extends Request, R extends Response> implements Delegator<T, R> {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
protected Processor<T, R> processor;
protected List<String> taskSequence;
protected AbstractDelegator(Processor<T, R> processor, List<String> taskSequence) {
this.processor = processor;
this.taskSequence = taskSequence;
}
}
CancelDelegator.kt
@Singleton
class CancelDelegator @Inject constructor(
@Named(CancelConstant.CANCEL_PROCESSOR) processor: Processor<Request?, Response?>?,
@Named(CancelConstant.CANCEL_TASKS) taskSequence: List<String?>?
) : AbstractDelegator<Request?, Response?>(processor, taskSequence)
GuiceModule.kt
bind<Delegator<Request?, Response?>?>(object : TypeLiteral<Delegator<Request?, Response?>?>() {})
.annotatedWith(Names.named(CancelConstant.CANCEL_DELEGATOR))
.to(CancelDelegator::class.java)
bind<List<String?>?>(object : TypeLiteral<List<String?>?>() {})
.annotatedWith(Names.named(CancelConstant.CANCEL_TASKS))
.toInstance(Arrays.asList(CancelConstant.CANCEL_PENALTY_TASK))
它只是 Guice 无法注入的列表。其他注射工作正常。我试过更改 List?到 List 和 List 但似乎没有任何效果。
如 this GitHub 问题中所述,
var setA: Set<Runnable>
var setB: MutableSet<Runnable>
等同于 Java 中的以下内容:
Set<? extends Runnable> setA;
Set<Runnable> setB;
您可以使用 @JvmSuppressWildcards
注释修复它。类似于以下内容:
bind(object : TypeLiteral<List<@JvmSuppressWildcards String>>() {})
.annotatedWith(Names.named(CancelConstant.CANCEL_DELEGATOR))
.toInstance(listOf("hello", "goodbye"))
尝试将字符串列表注入 class 构造函数时出现以下错误。我将 AbstractDelegator java class 扩展为 CancelDelegator。 AbstractDelegator 是从依赖项 jar 中引用的,所以我无法更改它。
No implementation for java.util.List<java.lang.String> annotated with @com.google.inject.name.Named(value=CANCEL_TASKS) was bound.
while locating java.util.List<java.lang.String> annotated with @com.google.inject.name.Named(value=CANCEL_TASKS)
for parameter 1 at com.cancel.core.delegator.CancelDelegator.<init>(CancelDelegator.kt:18).
at com.cancel.core.config.CancelModule.configure(CancelModule.kt:45)
以下是 classes:
AbstractDelegator.java(来自依赖 jar)
public abstract class AbstractDelegator<T extends Request, R extends Response> implements Delegator<T, R> {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
protected Processor<T, R> processor;
protected List<String> taskSequence;
protected AbstractDelegator(Processor<T, R> processor, List<String> taskSequence) {
this.processor = processor;
this.taskSequence = taskSequence;
}
}
CancelDelegator.kt
@Singleton
class CancelDelegator @Inject constructor(
@Named(CancelConstant.CANCEL_PROCESSOR) processor: Processor<Request?, Response?>?,
@Named(CancelConstant.CANCEL_TASKS) taskSequence: List<String?>?
) : AbstractDelegator<Request?, Response?>(processor, taskSequence)
GuiceModule.kt
bind<Delegator<Request?, Response?>?>(object : TypeLiteral<Delegator<Request?, Response?>?>() {})
.annotatedWith(Names.named(CancelConstant.CANCEL_DELEGATOR))
.to(CancelDelegator::class.java)
bind<List<String?>?>(object : TypeLiteral<List<String?>?>() {})
.annotatedWith(Names.named(CancelConstant.CANCEL_TASKS))
.toInstance(Arrays.asList(CancelConstant.CANCEL_PENALTY_TASK))
它只是 Guice 无法注入的列表。其他注射工作正常。我试过更改 List
如 this GitHub 问题中所述,
var setA: Set<Runnable>
var setB: MutableSet<Runnable>
等同于 Java 中的以下内容:
Set<? extends Runnable> setA;
Set<Runnable> setB;
您可以使用 @JvmSuppressWildcards
注释修复它。类似于以下内容:
bind(object : TypeLiteral<List<@JvmSuppressWildcards String>>() {})
.annotatedWith(Names.named(CancelConstant.CANCEL_DELEGATOR))
.toInstance(listOf("hello", "goodbye"))