"方法......不适用"在泛型类

时间:2016-02-28 06:55:11

标签: generics java-8 type-inference

我试图绑定泽西岛的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;表现得像我期待的那样)

2 个答案:

答案 0 :(得分:1)

由于MyFactory未声明为static,因此它具有类型为TestFeature<K>的封闭实例,因此对于正确的通用操作,需要K的实际类型。请注意,MyFactory.classTestFeature.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));
    }
}