Tag: kotlin interop

“意外覆盖:以下声明具有相同的JVM签名”在实现Java接口时

我遇到了以下错误,试图扩展RuntimeException,并从我的Kotlin代码实现Java中定义的GraphQLError接口。 这是错误的: 意外覆盖:以下声明具有相同的JVM签名(getMessage()Ljava.lang.string;): public open fun (): String? defined in NegativeCountException public open fun (): String? defined in NegativeCountException public open fun getMessage(): String? defined in NegativeCountException public open fun getMessage(): String? defined in NegativeCountException 以下是我的代码: class NegativeCountException() : RuntimeException(), GraphQLError { override fun getMessage(): String? { TODO(“not implemented”) } } 其中GraphQLError是一个接口,在Java中定义,如下所示: public interface GraphQLError […]

为什么`Intrinsics.checkParameterIsNotNull`没有内联?

在Kotlin中,如果我们将一些Kotlin字节码反编译为Java,我们经常可以看到这样的语句: Intrinsics.checkParameterIsNotNull(foo, “foo”) 如果我们继续探索,我们可以看到这个方法的反编译实现,它的实现和它的名字完全一样: public static void checkParameterIsNotNull(Object value, String paramName) { if (value == null) { throwParameterIsNullException(paramName); } } 由于这个类( Intrinsics )的存在,我不能使用没有stdlib的Kotlin,即使我尽我所能避免使用stdlib中的函数,它也会自动生成对Intrinsics.checkParameterIsNotNull调用。 由于这个方法的实现非常短(而且很常见),为什么这个函数没有内联呢? 有没有一些注释可以让我们阻止Kotlin编译器生成这个空检查? (也许像@TrustedNotNull ) 对于ProGuard:我很担心,因为我正在使用共享库,在这种情况下ProGuard不适合我。 我显然知道那些代码清除工具(ProGuard,dce-js),我知道如何以及何时使用它们。 我只是问为什么是一个函数不内联。

Kotlin Vertxtypes不匹配发现未来预期处理程序<AsyncResult >

我以为在Kotlin, Unit就相当于Void 。 使用Vert.x服务发现,不可能传递Future来unpublish(String id, Handler<AsyncResult> resultHandler) (给出types不匹配),但它将接受Future没有任何问题。 为什么是这样的,有没有一个解决方案,或者我只需要生活在使用Void ?

Kotlin – 安全呼叫运营商的链接。 不必要的话务员

以下面使用安全调用操作符(?。)的示例: class Sample { class A( val sampleB: B? = B() ) class B( val sampleC: C = C() ) class C( val sampleInt: Int = 1 ) fun test() { val intInC: Int? = A().sampleB?.sampleC?.sampleInt } } 我知道我们需要一个安全的调用操作符sampleB。 但是为什么我们需要在sampleC上安全的调用操作符。 如果我删除该运算符,它不会编译。 基于我对运算符的理解,如果sampleB为空,则该行将返回null。 如果sampleB不为null,我们可以确定sampleC不是null,根据它的types。 但为什么Kotlin强制安全调用operatorC?

Kotlin编译器的types推断不能选择调用哪个方法(与genericstypes不一致)

所以,我有一些这些签名的Java方法(为简单起见,删除了注释和代码体): public class JavaClass { public static E join(E… array) { … } public static E join(CharSequence separator, E… array) { … } } 我在Kotlin中有一些代码,它调用了’join’方法: class KtClass { fun test(vararg array: String) { JavaClass.join(*array) } } 到现在为止还挺好; 它会传播可变参数并称之为方法签名。 好的! 例如,如果我想用“分隔符”参数来调用后一个方法签名,就会出现问题: class KtClass { fun test(vararg array: String) { JavaClass.join(“”, *array) } } 这段代码不会编译。 编译器无法决定调用哪个方法。 错误: […]

自己的SDK架构 – Kotlin中的异步方法API

我们正在为我们的产品构建一个公共的SDK。 它是用Kotlin和内部我们使用协程。 但是,我们想要发布一个可用于JAVA的API,这就是为什么不能提供挂起的function作为公共API。 如果Java中的可用性不如Kotlin那么舒服,那么我们也可以。 所以,例如,我们正在寻找下面的异步方法的返回types: class Sdk { fun getPlace(): ___ } 我们考虑过的事情: 使用RX Java作为接口。 我们不喜欢这个解决方案,Rx非常复杂,我们希望尽可能少地添加其他的依赖关系。 一般来说,我们会去返回单。 但是,Rx java我们不想解决的问题(哪个线程应该是已完成的工作),而Rx并不解决我们想要解决的问题(如果可能的话),例如生命周期和观察者 – Android架构组件中解决的问题。 Java 8的未来。 这似乎是最合适的,但不可能,因为我们需要针对较旧的Android(至少4.1)。 Android架构LiveData。 返回一个LiveData似乎没问题,还有一个observeForever()方法,使它可以在后台线程中使用。 另一方面,api表明它可能会重复返回多个结果。 但是,我们只希望在结果或者一个例外上忽略。 但是,在Kotlin中,我们可以实现扩展函数,这将使得它可以像sdk.getPlace().await() 。 自定义解决方案:返回一个简单的Result对象,通过提供一个回调sdk.getPlace().observe(Observe { onSucccess(data: Place) {} onFailure(e: Throwable) {} }) 我们将提供一个等待的扩展function。 问题: 我们错过了一些重要的方面/图书馆/可能性吗? 我们应该选择哪种解决方案,为什么

将Thread / Runnable实现从Java转换到Kotlin

我有一个现有的Java类ThreadUtils ,每个方法every这样的: public class ThreadUtil { public static Thread every(int seconds, Runnable r) { Thread t = new Thread(() -> { while(true) { r.run(); try { Thread.sleep(1000 * seconds); } catch (InterruptedException e) { return; } } }); t.start(); return t; } } 我试图把它转换成Kotlin。 我有点挂在Runnable关闭。 这不合格的return : fun every(seconds: Int, r: Runnable): Thread { val […]

为什么一些Java的setter方法自动成为Kotlin的属性,但有一些不是?

例如这个WebSettings Java类。 它有一个Java方法setJavaScriptEnabled(boolean) ,它变成如下的Kotlin属性javaScriptEnabled ,但也有setSupportZoom(boolean) ,它不会变成Kotlin属性supportZoom 。 settings.javaScriptEnabled = true settings.domStorageEnabled = true settings.setSupportZoom(false) settings.builtInZoomControls = false settings.setSupportMultipleWindows(true)

Kotlin和Spring Data JPA产生PropertyReferenceException

我目前正在使用Spring Data JPA的Kotlin 1.2和Spring Boot 2.0 M7。 在这个项目中,我正在使用一个自定义的基础知识库,而不是JPARepository或PagingAndSortingRepository(实际上并不重要) 这里是基础接口 @NoRepositoryBean interface BaseRepository : Repository { fun save(entity: S): S fun findOne(id: ID): T? fun findAll(): List fun count(): Long } 这里是实际的存储库 interface ArticleRepository : BaseRepository { } 最后这里是文章数据类 @Entity @Table(name = “article”) @Cacheable data class Article ( @Id @GeneratedValue(strategy = IDENTITY) @Column(name = “id”, unique […]

更改kotlin扩展函数接收器的JVM名称

这是一个普遍的问题。 假设我有一个用kotlin编写的扩展函数,它将DP转换为PX并返回一个NonNull Int fun Int.toPx() { /** implementation */ } java中的函数看起来像这样 public int toPx(int $receiver) { /** implementation */ } 在我看来, $receiver器使Java互操作感觉生成和不受欢迎。 我知道你可以用像@file:JvmName这样的组合来使用@JvmName注解来改变java中的名字。 当我试图使用@JvmName与receiver网站的目标说 “此注释不适用于目标type usage并使用站点目标@receiver ” 有没有办法来克服,并改变接收器的名称,如果不是什么是最好的选择。