当前位置: 首页 > 知识库问答 >
问题:

Kotlin方法重载

屠钊
2023-03-14

以下声明在科特林是合法的。

fun foo(): String = "foo_1"
fun <T> foo(): T = "foo_2" as T

作为字节码,我们得到:

public final static foo()Ljava/lang/String;

// signature <T:Ljava/lang/Object;>()TT;
// declaration: T foo<T>()
public final static foo()Ljava/lang/Object;

也可以从Kotlin调用这两个方法。

当我试图从Java调用它们中的任何一个时,问题就出现了:

ClassKt.foo()

模棱两可的调用。两种方法都匹配…

如何避免这样的问题?如何处理这些方法?若第三方kt库也有同样的问题怎么办?

上面的例子是一个合成的例子。

共有3个答案

宇文卓
2023-03-14

一个简单的解决方案是用Kotlin编写一个helper方法并调用它。

另一种仅使用Java的方法是为这两种方法获取MethodHandle并使用它们:

MethodHandle MH_fooString = lookup().findStatic(ClassKt.class, "foo", methodType(String.class));
MethodHandle MH_fooT = lookup().findStatic(ClassKt.class, "foo", methodType(Object.class));

String foo = (String) MH_fooString.invokeExact();

但它并没有那么简单,需要处理异常。

隗轶
2023-03-14

当从java调用代码时,可以使用@JvmName来区分代码:

@JvmName("fooString")
fun foo(): String = "foo_1"

fun <T> foo(): T = "foo_2" as T

这将允许使用ClassKt.fooString()Java调用String方法,从而解决冲突。

戚云
2023-03-14

为什么它与科特林一起工作开始...在Java中有两种方法,例如:

private static String test() {
    return "";
}

private static <T> T test() {
    return null;
}

会导致编译时错误。对于java开发人员来说,这是显而易见的,这些方法会有相同类型的擦除。但是这是由< code>javac强加的规则,而不是由运行该代码的< code>JVM强加的规则。因此< code>javac不会将只有不同返回类型的两个方法视为重载。嗯,< code>kotlin是一种不同的语言,因为它运行在< code>JVM(期望有效的字节码)上,它允许将只有返回类型不同的方法视为重载。我还没有看到字节码并理解这是如何发生的;这似乎只适用于一般代码,所以在kotlin的情况下,类型擦除可能略有不同。

现在,事情应该很明显,为什么从java调用这样的方法失败了。Kotlin 为此提供了一个简洁的解决方案:@JvmName(“某些特定名称”)。我也不完全确定这在引擎盖下是如何工作的......然而,尽管我认为这将创建一个桥接方法。

编辑

@JvmName将在字节码级别重命名该方法。

 类似资料:
  • 我在Java中有一个模型类,我把它转换成了kotlin中的数据类 正如您所看到的,我希望在检索变量时更改它的值。 当服务器试图检索时,它返回null,而它应该返回新值。对象具有值,但'videoassets.gethls()'始终为null。 有人能指出我缺少什么吗?

  • 本文向大家介绍Kotlin实现静态方法,包括了Kotlin实现静态方法的使用技巧和注意事项,需要的朋友参考一下 工具类 全都是静态方法的情况 : class 类名 改为 object 类名 即可 普通静态方法 一部分是静态方法的情况 : 将方法用 companion object { } 包裹即可 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 重载子类中重写的方法,我是重载父方法还是重载子类方法? 我大体上理解什么是超载和超驰。 重载-同一方法在同一个类中有不同的参数和可能的返回类型。 重写-子类中的方法签名与父类中的方法签名相同,但实现不同。 方法B.a(INTX)是重载a.a还是重载B.a?

  • 增加对SharedReferences调用的可读性。编辑器我想使用一个Kotlin变量来执行“getSharedReferences”。每次我需要一个新的SharedReferences时,编辑()。编辑起初,我打算用这样的东西: 但后来我被告知,“editPreferences”将保留对同一个编辑器的引用,而我真正想要的是在每次调用“editPreferences”时创建一个新的编辑器。 如果使

  • 我希望能够将类实例保存到公共静态变量中,但我不知道如何在Kotlin中做到这一点。

  • Java 允许同一个类中定义多个同名方法,只要它们的形参列表不同即可。 如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,这种情况被称为方法重载(overload)。 例如,在 JDK 的 java.io.PrintStream 中定义了十多个同名的 println() 方法。 这些方法完成的功能类似,都是格式化输出。根据参数的不同来区分它们,以进行不同的格式化处理和输出。它们之