繁体   English   中英

Java Guice-方法toProvider不适用于参数

[英]Java Guice - the method toProvider is not applicable for the arguments

我正在从此处关注Guice文档: http : //code.google.com/p/google-guice/

而且我陷入了toProvider方法。 当我尝试这样做时:

bind(Shape.class).toProvider(ShapeProvider.class);

我收到此错误:

The method toProvider(Provider<? extends Shape>) in the type LinkedBindingBuilder<Shape> is not applicable for the arguments (Class<ShapeProvider>)

我的代码如下:

配置类

public class Configuration extends AbstractModule{
    @Override
    protected void configure(){
        bind(Shape.class).toProvider(ShapeProvider.class);
        bind(Triangle.class).to(IsoTriangle.class);
    }

ShapeProvider类

public class ShapeProvider implements Provider<Shape> {
    private int length;
    @Inject
    public ShapeProvider(int length){
        this.length = length;
    }
    public Shape get(){
        Shape triangle = new Triangle(length);
        return triangle;

    }
}

形状界面

public interface Shape {

}

三角课

public class Triangle implements Shape{
    int length;
    public Triangle(){
    }
    public Triangle(int lenght){
        this.length = lenght;
    }
}

我是否想念某些东西或文档中没有提到的东西?

更新:

提供者接口:

public interface Provider<T> {
    T get();
}

如果使用toProvider ,则必须提供Provider实例。 请参阅LinkedBindingBuilder.toProvider的javadoc

bind(Shape.class).toProvider(new ShapeProvider());

或者您应该使用to类为参数的参数。 另请参见LinkedBindingBuilder.to()的javadoc

bind(Shape.class).to(ShapeProvider.class);

编辑

我无法重现您的问题。 我创建了一些类来模拟问题(因为我现在不想设置guice),但是据我所知……没有编译器错误。

以下代码与guice api类型等效,并且可以编译。

public class Main {

    public static void main(String[] args) {
        LinkedBindingBuilder<Shape> linkedBindingBuilder = new LinkedBindingBuilder<Shape>();
        linkedBindingBuilder.toProvider(new ShapeProvider());
    }

    public static class ShapeProvider implements Provider<Shape> {
        public Shape get() {return null;}
    }

    public static class Shape {}

    public static class LinkedBindingBuilder<T> {

        public ScopedBindingBuilder toProvider(Provider<? extends T> provider) {
            return null;
        }
    }

    private static interface Provider<T> {
        T get();
    }

    private static class ScopedBindingBuilder {}
}

我发现出了什么问题。 我以为我需要自己实现提供者接口,如Google / Guice文档中所示,但是显示了该接口的外观。 所以我不小心覆盖了原始的Provider接口。 当我删除提供者接口时,一切都解决了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM