【问题标题】:extension method for utility class from external library来自外部库的实用程序类的扩展方法
【发布时间】:2017-01-04 09:14:39
【问题描述】:

我正在使用来自apache commonsFilenameUtils

我在代码中有这样的动作

val customPath = FilenameUtils.getPath(source) +
        DEFAULT_SEPARATOR + FilenameUtils.getBaseName(source)
val resultPath = FilenameUtils.separatorsToSystem(customPath)

我决定把它变成扩展方法。我把它移到了单独的类中。

object PluginExtensions {

    fun FilenameUtils.normalizeFilePath(source: String) : String {
        val customPath = FilenameUtils.getPath(source) +
                DEFAULT_SEPARATOR + FilenameUtils.getBaseName(source)
        return FilenameUtils.separatorsToSystem(customPath)
    }

    fun File(name: String) : File = File(name).apply {
        createNewFile()
    }
}

但是在我使用它的类中找不到该新方法

有什么问题?

【问题讨论】:

    标签: extension-methods kotlin


    【解决方案1】:

    在你可以使用这个扩展方法之前,你必须导入它。

    import PluginExtensions.normalizeFilePath
    

    您的扩展功能仅为 PluginExtensions 对象定义。您需要导入此对象之外的任何位置以使扩展可见。替代方法是在包级别定义扩展。这将使您的扩展对整个包可见。

    查看扩展文档。特别是Scope of Extensions

    【讨论】:

    • 我要强调的是,顶级扩展函数目前是声明它们的首选方式。我不确定对象级扩展是否应该以这种方式工作。
    • 自动完成对象扩展的相关问题(目前“待考虑”):youtrack.jetbrains.com/issue/KT-15286#tab=History
    • 我明白了。我觉得我需要以某种方式导入它,但是我不知道该怎么做。
    【解决方案2】:

    您需要将函数导入到调用它的文件中。扩展函数不在您要扩展的类中。它位于您定义它的位置。

    把这个写在你使用函数的文件中:

    import PluginExtensions.normalizeFilePath
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      • 2011-06-06
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多