Android studio 如何防止在对象上使用kotlin扩展?

Android studio 如何防止在对象上使用kotlin扩展?,android-studio,kotlin,Android Studio,Kotlin,对于我的应用程序中的特殊线程问题,我使用接受块的runOrQueue()方法创建了一个对象。以下是用于说明目的的简化版本: class SpecialThread { fun runOrQueue() {} } 问题是,当我尝试使用此方法编写代码时,IDE会首先自动完成到标准库中定义的: @kotlin.internal.InlineOnly public inline fun <T, R> T.run(block: T.() -> R): R {…} @kotli

对于我的应用程序中的特殊线程问题,我使用接受块的
runOrQueue()
方法创建了一个对象。以下是用于说明目的的简化版本:

class SpecialThread {
    fun runOrQueue() {}
}
问题是,当我尝试使用此方法编写代码时,IDE会首先自动完成到标准库中定义的:

@kotlin.internal.InlineOnly
public inline fun <T, R> T.run(block: T.() -> R): R {…}
@kotlin.internal.InlineOnly
公共内联funt T.run(块:T.()->R):R{…}
以下是IDE自动完成的屏幕截图:

这在我的应用程序中尤其危险,因为
run
runOrQueue
都会有类似的结果(都运行一段代码),但标准库版本在某些情况下会崩溃,并正确地包装在
runOrQueue
方法中


是否有任何方法可以显式禁用在我创建的特定对象上使用
run
扩展的可能性?事实上,回顾我自己编写的代码,我已经错误地使用了两次
run
,而不是较长的方法名,这是不好的。

我担心这是不可能的,因为run在std库中,被定义为任何类型的扩展:

/**
 * Calls the specified function [block] with `this` value as its receiver and returns its result.
 */
@kotlin.internal.InlineOnly
public inline fun <T, R> T.run(block: T.() -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block()
}
/**
*使用'this'值作为其接收器调用指定函数[block],并返回其结果。
*/
@kotlin.internal.InlineOnly
公共内联趣味T.run(区块:T.()->R):R{
合同{
callsInPlace(块,调用种类,恰好一次)
}
返回块()
}
一些选择:

对于代码库中不希望使用
run
的部分,请改用Java编写(因为Kotlin和Java是完全可插入的)。这个解决方案并不理想

当您指的是运行队列时,不要写
runOrQueue

编写自定义lint扩展以标记
run
的用法作为警告或错误:

编辑:


Forpas提供了另一个很好的解决方案,可以将函数重命名为
queueOrRun
。这个问题是OR,我想你的方法试图运行,如果不可能,只会返回到队列,因此更改函数名会使它的功能变得不那么清晰。

虽然重命名方法的注释是值得的,我不断尝试防止编译错误的代码,并设法达成妥协,这可能会推广到将来可能发生的其他符号冲突

首先,为了混淆编译器,向对象添加了一个非常类似的方法:

@Deprecated(level = DeprecationLevel.ERROR,
        message = "This is not the method you are looking for (waves hand)",
        replaceWith = ReplaceWith("runOrQueue()"))
fun <T, R> run(block: T.() -> R): R {
    TODO("Don't use this")
}

虽然不是世界上最漂亮的,但它很接近并完成了任务。或者正如Sally Amaki所说,.

如果你真的不想重命名你的方法,并且你绝对确定你永远不会使用
run
函数

通过单击建议旁边的意向操作图标,实际上可以从自动完成中排除任何方法:

设置
中,您可以在
编辑器->常规->自动导入
下找到它,然后
从导入和完成中排除
。例如,要排除内置的
run
函数,您可以通过上述意图或手动添加此项:

如果您将此项目设置为范围,则也可以将排除检查到VCS中,您可以在
.idea/codeInsightSettings.xml
下找到它,它将包含要排除的相应内容
运行
,非常简单:

<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="JavaProjectCodeInsightSettings">
    <excluded-names>
      <name>kotlin.run</name>
    </excluded-names>
  </component>
</project>

kotlin.run

既然您发现它很危险,而且可能很危险,为什么不将其重命名为
queueOrRun()
?或
queueIfNotRun()
(这是根据Thomas Cook的建议)聪明的解决方法-糟糕的生产理念。。。您可以将此逻辑应用于具有类似名称的任何方法。只需确保调用了正确的方法。编译器不是在抱怨歧义,而是在挑选成员。它只是“应该”被定义为
fun run(block:SpecialThread.)->R
(因为
T
是固定的)。哈,我不知道!
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="JavaProjectCodeInsightSettings">
    <excluded-names>
      <name>kotlin.run</name>
    </excluded-names>
  </component>
</project>