以下声明在科特林是合法的。
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库也有同样的问题怎么办?
上面的例子是一个合成的例子。
一个简单的解决方案是用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();
但它并没有那么简单,需要处理异常。
当从java调用代码时,可以使用@JvmName来区分代码:
@JvmName("fooString")
fun foo(): String = "foo_1"
fun <T> foo(): T = "foo_2" as T
这将允许使用ClassKt.fooString()
Java调用String方法,从而解决冲突。
为什么它与科特林一起工作开始...在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() 方法。 这些方法完成的功能类似,都是格式化输出。根据参数的不同来区分它们,以进行不同的格式化处理和输出。它们之