【发布时间】:2018-03-09 19:34:11
【问题描述】:
我正在尝试使用 jersey 2/HK2 自动绑定具有特定注释的工厂类。因此,我在运行时从泛型接口获取提供的类型,然后尝试将工厂绑定到该类型。将工厂绑定到类的方法如下所示:
protected void bindResourceFactory(Class<? extends Factory<?>> factory) {
Class<?> providedClass = getProvidedClass(factory);
bindFactory(factory).to(providedClass).in(Singleton.class);
}
HK2提供的bindFactoy方法定义如下:
public <T> ServiceBindingBuilder<T> bindFactory(Class<? extends Factory<T>> factoryType) {
return resetBuilder(AbstractBindingBuilder.<T>createFactoryBinder(factoryType, null));
}
当我用 eclipse 构建所有东西时,这似乎工作得很好。但是,当我使用 maven 构建项目时,出现以下构建错误:
[ERROR] /Users/jan/Documents/Workspace/jersey-test/bind/ResourceFactoryBinder.java:[32,5] no suitable method found for bindFactory(java.lang.Class<capture#1 of ? extends org.glassfish.hk2.api.Factory<?>>)
[ERROR] method org.glassfish.hk2.utilities.binding.AbstractBinder.<T>bindFactory(java.lang.Class<? extends org.glassfish.hk2.api.Factory<T>>,java.lang.Class<? extends java.lang.annotation.Annotation>) is not applicable
[ERROR] (cannot infer type-variable(s) T
[ERROR] (actual and formal argument lists differ in length))
[ERROR] method org.glassfish.hk2.utilities.binding.AbstractBinder.<T>bindFactory(java.lang.Class<? extends org.glassfish.hk2.api.Factory<T>>) is not applicable
[ERROR] (cannot infer type-variable(s) T
[ERROR] (argument mismatch; java.lang.Class<capture#1 of ? extends org.glassfish.hk2.api.Factory<?>> cannot be converted to java.lang.Class<? extends org.glassfish.hk2.api.Factory<T>>))
[ERROR] method org.glassfish.hk2.utilities.binding.AbstractBinder.<T>bindFactory(org.glassfish.hk2.api.Factory<T>) is not applicable
[ERROR] (cannot infer type-variable(s) T
[ERROR] (argument mismatch; java.lang.Class<capture#1 of ? extends org.glassfish.hk2.api.Factory<?>> cannot be converted to org.glassfish.hk2.api.Factory<T>))
两种情况下的java版本都是1.8.0_152。
原因可能是我使用的参数是Class<? extends Factory<?>> 类型,而bindFactory 需要Class<? extends Factory<T>>。有人知道,为什么这可能是用 eclipse 而不是用 maven 构建的?除了通过反射调用bindFactory 之外,还有什么方法可以使这项工作正常进行吗?
【问题讨论】:
-
嗯,差异可能是因为 eclipse 使用它自己的编译器 (ECJ) 而 maven 使用 java 的。如果您在 bindFactory 中指定泛型类型,它会起作用吗?例如
-
很高兴知道!不,在 eclipse 或 maven 中无法编译:
The parameterized method <Object>bindFactory(Class<? extends Factory<Object>>) of type AbstractBinder is not applicable for the arguments (Class<capture#8-of ? extends Factory<?>>) -
嗯,有道理,尝试铸造工厂
this.<Object>bindFactory((Class<? extends Factory<Object>>) factory)。抱歉,我现在手头没有日食。 -
是的,这行得通
bindFactory((Class<Factory<Object>>) factory)! -
太好了,我会发布更详细的答案。
标签: java generics java-8 jersey-2.0 hk2