我试图绑定泽西岛的HK2工厂,编译器因无法找到合适的方法重载而产生奇怪的错误。该错误似乎与推断泛型类型有关,但即使我明确指定泛型,它仍然似乎不喜欢它。我希望编译以下示例代码:
import org.glassfish.hk2.api.Factory;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import javax.ws.rs.core.Feature;
import javax.ws.rs.core.FeatureContext;
public class TestFeature<K> implements Feature {
@Override
public boolean configure(FeatureContext context) {
context.register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(MyFactory.class).to(String.class);
}
});
return true;
}
private class MyFactory implements Factory<String> {
@Override
public String provide() {
return "";
}
@Override
public void dispose(String instance) {
// do nothing
}
}
}
如果我将TestFeature<K>
更改为TestFeature
(即,使外部类非泛型),它确实如此。但是,按原样,bindFactory()
会出现以下错误:
method org.glassfish.hk2.utilities.binding.AbstractBinder.<T>bindFactory(java.lang.Class<? extends org.glassfish.hk2.api.Factory<T>>) is not applicable
(cannot infer type-variable(s) T
(argument mismatch; java.lang.Class<zone.fur.mongo.TestFeature.MyFactory> cannot be converted to java.lang.Class<? extends org.glassfish.hk2.api.Factory<T>>))
即使我明确绑定T
:
this.<String>bindFactory(MyFactory.class).to(String.class);
然后错误仍然存在(尽管我的IDE在任何一种情况下都不会将其突出显示为错误。)
有人可以解释为什么TestFeature
是通用会导致类型推断中断,以及我可以做些什么来解决它或解决它? (在我的实际代码中,我设法重构了一些东西,并使外部类非通用,这使得问题消失了,但我仍然想知道这里发生了什么以及为什么它没有&#39;表现得像我期待的那样)
答案 0 :(得分:1)
由于MyFactory
未声明为static
,因此它具有类型为TestFeature<K>
的封闭实例,因此对于正确的通用操作,需要K
的实际类型。请注意,MyFactory.class
是TestFeature.MyFactory.class
的简称;这个缩写是可能的,因为MyFactory
在范围内。您需要TestFeature<A>.MyFactory.class
之类的A
作为K
的实际类型,但不幸的是Class
个对象无法捕获实际的类型参数。
所以解决方案要么是,不要将外部类设为通用,要么将MyFactory
声明为static
,如果它没有对参数化外部类型的依赖。能够在不收到新编译器错误的情况下删除<K>
表示K
内未使用MyFactory
。也可以将外部类的功能分成两部分。如果外部类是泛型类型的非泛型子类型,如MyFactory
,则它将起作用。
答案 1 :(得分:0)
忽略重写编译错误。这看起来像是Eclipse IDE中的一个错误。 我尝试了这个代码,它工作得很好。
import org.glassfish.hk2.api.Factory;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import javax.ws.rs.core.Feature;
import javax.ws.rs.core.FeatureContext;
public class TestFeature<K> implements Feature {
public boolean configure(FeatureContext context) {
return false;
}
public static void main(String[] args) {
Feature f = new TestFeature<String>();
System.out.println(f.configure(null));
}
}