package org.example;
public class ParentJava {
public String name;
}
import org.example.ParentJava
class Child(val name: String): ParentJava()
fun main() {
Child("").name
}
如上代码,运行闪退。
问:为什么?
问题来源于xujiafeng
更多问答 >>
-
2024-06-06 11:06
-
2023-10-25 00:22
-
每日一问 | Java线程栈的栈溢出(StackOverflowError)是如何检测的?
2024-02-19 18:30 -
每日一问 | targetSdkVersion 有什么神奇的魔力?
2023-05-24 17:30 -
每日一问 | Android 模块化依赖中的资源冲突该如何规避?
2023-05-24 17:30 -
每日一问 | Android 默认开启硬件加速与设置hardwareAccelerated是一回事吗?
2023-05-24 17:30 -
每日一问 | 瘦身属性?对android:extractNativeLibs属性的探讨
2022-12-07 14:43
尽管这个问题挺沙雕,那我也是运行看了看,确实有一些疑惑,主要是在对应的.name上,如果我们没有继承ParentJava,那么对应的kotlin会调用getName方法的形式调用,而如果继承了Parent,这里反编译后能看到他是通过.name的形式调用的,而同时我们也知道属性同名是会被覆盖的,这里出现的问题就是public name,结果被private name覆盖了。(这原则上是不行的,你可以尝试用java写写看),而Kotlin这个地方没有这方面检查,反而调用的时候还直接替换成了.name调用了。站在我的视角理解,我觉得这是有问题的,可能Kotlin自己也清楚?所以提供了JVMField来告诉你,如果你出现了这种继承覆盖什么的,你给我用他保证在这种继承关系上不要出问题。
java 17.0.09
kotlin 1.9.20运行并不会闪退.给个前提条件试了一下出现了这个错误,感觉和大家说的不是一回事,不确定是不是新的kotlin版本编译得结果
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics at XXX.Child.<init>(Child.kt) at XXX.ChildKt.main(Child.kt:11) at XXX.ChildKt.main(Child.kt)Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 3 more好问题
-.-
-、-
测试下消息 查看消息数据模型
public private
峰鸡儿,我的神帮大家反编译的一下kotlin代码
看起来代码是Java和Kotlin两部分构成, Kotlin 代码中, Child 类从 ParentJava 类继承了一个公共字段 name,然而这个字段在 Java 中是非私有成员,这可能导致在 Kotlin 中使用时出现问题。
如果使用 Java 的非私有成员,需要使用 @JvmField 注解使其在 Kotlin 中作为公共字段访问。因此,可以尝试将 ParentJava 类更改为以下内容:
package org.example;
public class ParentJava {
@JvmField public String name;}@JvmField 注解的作用是在 Java 和 Kotlin 之间提供互操作性,它会告诉 Kotlin 编译器生成一个公共 Java 字段,以便在 Kotlin 代码中直接访问它,而不是通过 getter 和 setter 方法来访问。
在 Kotlin 中,所有公共的属性都会自动生成 getter 和 setter 方法,因此如果想要在 Kotlin 中直接访问 Java 中的公共字段,可以使用 @JvmField 注解告诉 Kotlin 编译器不要为该字段生成 getter 和 setter 方法。
在这种情况下,由于 ParentJava 类中的 name 字段是公共的,而 Kotlin 中的属性是默认生成 getter 和 setter 方法的,因此在 Kotlin 中访问 name 属性会生成一个 getter 方法,而不是直接访问 Java 中的字段。如果尝试将其更改为 private 字段,则在 Kotlin 中无需使用 @JvmField 注解,因为 Kotlin 中的私有字段不会生成 getter 和 setter 方法,不过为了能在子类访问,不想加注解可以改为protected类型
你这他妈问的ChatGPT吧
Prompt Engineer