我可以使用Kotlin随播对象方法隐藏Java静态方法吗?

时间:2018-07-25 19:41:12

标签: java kotlin

我正在尝试向我的应用程序添加一些特定于类的功能,并且我希望在类层次结构中具有静态方法,其中每个类都实现自己的方法版本。我知道将它们视为替代会产生难以预测的行为,但我打算仅以类名作为前缀来调用方法。就像

'conv_ops_gpu_3.cu.cc'

像这样,Android Studio抱怨Child.mapString()意外覆盖,但是如果我添加// Java public class Base { public static int mapString(@NonNull String s) { int value = Child.mapString(s); if (value < 0) { return defaultValue; } } } // Kotlin class Child: Base() { companion object { @JvmStatic fun mapString(s: String): Int { return when { "a" -> 1 else -> -1 } } } } 关键字,则Android Studio抱怨没有发现任何东西可以覆盖。

是否可以从Kotlin隐藏Java基类的静态方法?

1 个答案:

答案 0 :(得分:0)

这是整个错误:

Accidental override: The following declarations have the same JVM signature (mapString(Ljava/lang/String;)I):
fun mapString(s: String): Int defined in com.example.Base
fun mapString(s: String): Int defined in com.example.Child

这可能是Kotlin如何通过Java互操作在幕后工作的问题。如果要防止错误,可以添加@JvmName批注以在JVM中使用另一个名称:

// Kotlin
class Child: Base() {
  companion object {
    @JvmStatic 
    @JvmName("childMapString")
    fun mapString(s: String): Int {
      return when {
        "a" -> 1
        else -> -1
      }
    }
  }
}