Tag: jvm

javac是否会生成静态桥接方法?

Java中使用Bridge方法来处理派生方法中的协方差,并更改派生方法的可见性。 然而,这两种情况都是例如方法(因为你不能派生静态方法)。 我正在研究Kotlin如何生成参数默认值,我感到震惊,它使用静态桥接方法。 我想不出Javac产生静态桥接方法的情况 – 其他人可以吗? (通过这个,我的意思是一个ACC_BRIDGE标志(0x40)被设置的方法,而不仅仅是一个语义上的桥接方法) (fwiw – 示例代码和反编译(使用cfr 0_124和–hidebridgemethods为false)) 方差 public class BridgeTest1Base { public T frob() { return null; } } public class BridgeTest1Derived extends BridgeTest1Base { public Integer frob() { return null; } } 反编译 public class BridgeTest1Derived extends BridgeTest1Base { @Override public Integer frob() { return null; } @Override public […]

在IntelliJ中Kotlin未解决的参考

我开始在IntelliJ学习Kotlin的教程 。当我尝试运行示例即 fun main(args: Array) { println(“lol”) } 执行被暂停这个消息Error:(5, 5) Kotlin: Unresolved reference: println这是我第一次使用IntelliJ.I从来没有在一个Java项目上工作。我错过了什么? 编辑:我已经看到了另一个问题。答案是不适合我的情况。

什么是从KType创建类实例的正确方法

我有两个类可能看起来像这样 class MyClass { var myProperty: AnotherClass? } class AnotherClass { } 通过reflection我遍历MyClass的属性,当我find一个KMutableProperty这是null我想创建该类的一个实例。 现在我正在做这样的事情 val instance = MyClass() val property = MyClass::myProperty var subInstance = it.getter.call(instance) if (subInstance == null) { it.setter.call(instance, property.returnType.jvmErasure.createInstance()) } 但这似乎是一个可怕的黑客,需要知道内部使用Java魔法而不是纯粹的Kotlin,有没有一个正确的方法来做我想要的? 或者这是正确的方式?

为什么我们不能用一个get来重写一个val属性,而不用初始化呢?

我刚刚开始学习Kotlin。 我想知道为什么我们无法将重写的val属性的get()方法用作var,而无需初始化它。 但是,如果重写为val则不需要初始化。 open class Foo { val y = 21 open val x: Int get() { return 10 * y } } class Bar : Foo() { override var x: Int = super.x * 10 //If overridden as val works without initialisation get() { return super.x * (super.x * 10) } } fun main(args: […]

无法在Eclipse中运行Kotlin应用程序

为了在Eclipse中创建我的第一个简单的Kotlin项目,我遵循了Kotlin官方网站的Eclipse Luna入门教程中的步骤,即: 从Eclipse Marketplace安装Eclipse的Kotlin Plugin 打开Kotlin的观点,并创建一个Kotlin项目 使用main方法在“src”文件夹内创建文件“hello.kt” 用鼠标右键单击文件>运行方式> Kotlin应用程序 但是,我不断在Eclipse控制台中得到以下错误: 错误:无法find或加载主类HelloKt 我已经仔细检查了我的项目的运行配置,它确实设置“主类”为HelloKt (我100%确定它不存在)。 另外,当我点击“搜索”按钮时,Eclipse发现的唯一项目是HelloKt – (default package) (这又不存在)。 为了完整起见,下面findhello.kt文件的代码: fun main(args: Array) { println(“Hello, World”) } 我注意到教程和我做了什么之间的差异: 我正在使用不同的Eclipse版本(本教程建议Luna;我使用Mars.2)。 我正在使用不同的JDK版本(教程不建议任何特定的版本,但从图像,我们可以看到他们使用jdk1.6.0_45 ,而我使用jdk1.7.0_79 。 请注意,我正在使用Kotlin Eclipse插件的最新版本,所以这与本文中的情况不一样。 这些是我当前安装的版本: Kotlin 0.7.2.v20160930-0748 kotlin-eclipse-policy 0.7.2.v20160928-1525 kotlin-weaving-feature 0.7.2.v20160928-1525 运行应用程序时,这些差异中的任何一个都可能是错误的原因吗? 您是否看到/了解有关此情况的任何潜在原因或已知错误? 更新(2017年5月14日) 试用Eclipse Neon.3(eclipse.buildId = 4.6.3.M20170301-0400),JDK 1.8.0_111,Kotlin 0.8.2.v20170314-0957(kotlin-eclipse-policy 0.8.2.v20170314-0957,kotlin-weaving – 特征0.8.2.v20170314-0957,Equinox Weaving SDK 1.2.0.201701131634)。 […]

在没有JVM支持的情况下,如何在JVM语言中实现协程?

在阅读Loom提案之后 ,提出了这个问题,该提议描述了使用Java编程语言实现协程的方法。 特别是这个建议说要在语言中实现这个function,将需要额外的JVM支持。 据我所知,JVM上已经有几种语言,它们的协同程序是Kotlin和Scala等function集的一部分。 那么如何在没有额外的支持的情况下实现这个function呢?

如何获得.kt文件中的所有类的列表

是否有可能获取.kt文件中的类的列表? 看来,KDeclarationContainer是我正在寻找的类,但我不确定如何使用它。 编辑:我正在使用Kotlinreflection。

Kotlin和jvm:对象OR类实例?

object SampleObject{ fun getSampleText(): String = “123” } class SampleClass { fun getSampleText(): String = “123” } 没有字段,只有方法。 ActivityA启动ActivityB 。 在ActivityB有一个对SampleObject.getSampleText()和SampleClass().getSampleText()的调用。 然后ActivityB完成。 最佳做法是什么? 使用对象还是使用类实例?

Kotlin:如何在运行时在OneClass 中获得实际的genericstypesT.

朋友们! 我是Kotlin的绿手,现在这是一个问题。 现在我想在OneClass中获得genericstypesT,下面是一些外围代码。 // IDatabase.kt package com.ra abstract class IDatabase { } // Database1.kt import kotlin.reflect.jvm.javaType open class Database1: IDatabase() { val tClass = this::class.supertypes[0].arguments[0].type!!.javaType as Class } // Database2.kt import kotlin.reflect.jvm.javaType open class Database2: IDatabase() { val tClass = this::class.supertypes[0].arguments[0].type!!.javaType as Class // just wrap a `object` to confort the user companion object { […]

确保kotlin方法是静态的,顶级的或注释的@JvmStatic

如何将main声明为static,以便该方法按照以下方式运行(交互式): thufir@dur:~/kotlin$ thufir@dur:~/kotlin$ kotlinc Welcome to Kotlin version 1.1.51 (JRE 9.0.0.15+181) Type :help for help, :quit for quit >>> >>> println(“hello world”); WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by com.intellij.util.text.StringFactory to constructor java.lang.String(char[],boolean) WARNING: Please consider reporting this to the maintainers of com.intellij.util.text.StringFactory WARNING: Use –illegal-access=warn to enable warnings […]