Search code examples
dependency-injectiondagger-2

does dagger recognize super class dependencies


My setup is like this

interface ServiceProvider {...}

@Singleton
class ServiceProviderImpl implements ServiceProvider {...}

class ServiceConsumer {

 @Inject
 ServiceConsumer(ServiceProvider prov) {...}
}

Unfortunately, this doesn't work as it claims there are no providers for ServiceProvider, even though there is one for subclass ServiceProviderImpl.

I get

error: [Dagger/MissingBinding] c.b.d.s.ServiceProvider cannot be provided without an @Provides-annotated method.

I can fix this by adding the following to the module

 @Provides
 @Singleton
 ServiceProvider serviceProvider(ServiceProviderImpl impl) {return impl;}

Is this by design, or am I doing something wrong?


Solution

  • This is by design. Dagger makes no assumptions about what implementation of an interface to use without you specifying it somewhere.

    For binding an implementation for an interface you should use @Binds, though, which is an optimized version of @Provides for implementation -> interface bindings.

    @Binds
    @Singleton
    ServiceProvider serviceProvider(ServiceProviderImpl impl);