【问题标题】:Why I receive Interface ... does not have constructors (I have Kotlin and java classes)?为什么我收到 Interface ... 没有构造函数(我有 Kotlin 和 java 类)?
【发布时间】:2021-02-13 05:41:04
【问题描述】:

这是我的 Kotlin 代码,当我构建时收到接口 ImageSizeProvider 没有构造函数

interface ImageSizeProvider {
    val spec: ImageSizeSpec
}

@FragmentScope
class ImageSizeProviderImpl @Inject constructor(
    private val mResources: Resources
) : ImageSizeProvider {
     override val spec: ImageSizeSpec
        get() = ...
}
and here is my java dagger interface ( I don't want to migrate this to Kotlin yet)




    @Module
public interface XXXModule {
    @Binds
    @FragmentScope
    ImageSizeProvider bindImageSizeProvider(ImageSizeProviderImpl imageSizeProvider);

【问题讨论】:

  • 我不确定你在问什么。接口永远不会有构造函数,因为它们不是类。
  • 我知道,但我收到了构建错误
  • 您能粘贴您在某些上下文中得到的确切错误消息吗? (发生的地方等)。您在此处发布的代码看起来不错,因此问题可能出在其他地方。
  • 我收到接口 ImageSizeProvider 没有构造函数,它显示 dagger 模块中不存在的行号,它显示在 dagger 模块中,该模块包含另一个实际提供的模块。
  • @I.S 你能粘贴带有上下文的错误消息吗?

标签: android kotlin dagger


【解决方案1】:

根据language documentationInterface 中声明的属性是抽象的。您的声明:

val spec ImageSizeSpec

因此是抽象的,您必须在任何实现Interface 的类中提供覆盖声明。您的 ImageSizeProviderImpl 不包含 spec 的覆盖声明。

如果创建ImageSizeProvider 的实例,这将失败,因为变量spec 未初始化。

【讨论】:

  • 我在实现中有 `override val spec: ImageSizeSpec`。我只是没有复制那个代码
  • 您必须在覆盖中设置一个值。 Interface 中不允许有可修改的数据,只能是常量。
  • 接口的java中的原始代码看起来像ImageSizeSpec getSpec();所以它应该是吸气剂
  • 明白。我试图遵循所有这些。您是否尝试在任何地方实例化ImageSizeSpec?看来这可能是问题的根源。见stackoverflow.com/questions/43737785/…
  • 没有。问题,已修复,我还没有看到它已初始化,我以为我只是提供,您帮我仔细检查并查看我的位置:)
猜你喜欢
  • 1970-01-01
  • 2011-05-18
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多