Tag: kotlin interop

Kotlin构造函数委托给内部数据类?

我们有一个抽象的Java类(我们不能修改)叫做AbstractClass ,我们要在Kotlin中实现。 一个要求是Kotlin实现是使用vanilla Jackson Databind对JSON进行序列化/反序列化的。 这导致我们执行以下操作: class MyClass(private val data: MyClassData? = null) : AbstractClass<MyClassData>(MyClass::class.java, "1") { data class MyClassData(var name: String = "", var age: Int = 0) : AbstractData override fun getData(): MyClassData? { return data } } 这个类将始终从Java中使用,目前您可以像这样(Java)实例化它: MyClass myClass = new MyClass(new MyClassData("John Doe", 25)); 但是我们宁愿像这样实例化它: MyClass myClass = new MyClass("John […]

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

我们正在为我们的产品构建一个公共的SDK。 它是用Kotlin和内部我们使用协程。 但是,我们想要发布一个可用于JAVA的API,这就是为什么不能提供挂起的功能作为公共API。 如果Java中的可用性不如Kotlin那么舒服,那么我们也可以。 所以,例如,我们正在寻找下面的异步方法的返回类型: 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) {} }) 我们将提供一个等待的扩展功能。 问题: 我们错过了一些重要的方面/图书馆/可能性吗? 我们应该选择哪种解决方案,为什么

用于从子类型推断通用超类型的Kotlin语法

试图将期望Class作为参数的现有Java代码调用,我在Kotlin中尝试了这个代码: package com.example //Acutally imported Java code in someone elses's library abstract class JavaCode<T> { fun doTheThing(thing: Class<JavaCode<T>>) { //Does work } } //My code class KotlinCode : JavaCode<String>() { fun startTheThing() { doTheThing(KotlinCode::class.java) } // ^ Type inference failed. Expected type mismatch } 但是,这不会编译以下错误: Type inference failed. Expected type mismatch: inferred type is Class<KotlinCode> […]

Kotlin编译器的类型推断不能选择调用哪个方法(带有泛型类型的歧义)

所以,我有一些这些签名的Java方法(为简单起见,删除了注释和代码体): public class JavaClass { public static <E extends CharSequence> E join(E… array) { … } public static <E extends CharSequence> 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("<br>", […]

调用java中java关键字的kotlin函数?

由于new不是kotlin中的关键字,我可以在kotlin中具有以下功能。 fun new(): String { return "just returns some string" } 但是我无法从java调用这个函数,因为new是java中的一个关键字。 我想知道在java领域是否有这个函数的别名。 我没有找到任何可能是这个函数的别名的intellij建议。 编辑1 : 我已经在kotlin中编写了下面的代码: fun new(): String { return "just returns some string" } fun main(args:Array<String>){ new() } 我看了一下java字节码。 这是如下。 // ================MainKt.class ================= // class version 50.0 (50) // access flags 0x31 public final class MainKt { // access flags 0x19 public […]

将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 […]

不能用RxKotlin“观察”主线程

我试图通过使用主线程观察可观察的: // Kotlin Code Observable .observeOn(AndroidSchedulers.mainThread()) 但我得到以下错误: Type Mismatch: Required: rx.Scheduler! Found: io.reactivex.Scheduler! 我订阅的Observable来自一个用Java编写的库,因此使用RxJava。 我是愚蠢的,错过了什么? 我puzzeled:$ 提前致谢 :)

Java lambda类型推断在Kotlin中没有像预期的那样工作

为什么在没有Collectors.toList<String>()的显式类型参数的情况下,这段Java代码不能在Kotlin中编译? 有没有更习惯的方式来做到这一点? // works List<String> folders = Files.walk(Paths.get(args[0])) .filter(it -> it.toFile().isDirectory()) .map(it -> it.toAbsolutePath().toString()) .collect(Collectors.toList()); // does not compile – resulting type is `MutableList<in String!>..List<Any?>?` which is not compatible to `List<String>` val folders: List<String> = Files.walk(Paths.get(args[0])) .filter { it.toFile().isDirectory } .map { it.toAbsolutePath().toString() } .collect(Collectors.toList()) // compiles val folders: List<String> = Files.walk(Paths.get(args[0])) .filter { it.toFile().isDirectory […]

智能投射不能按预期工作

我有以下Kotlin代码: fun handleResult(clazz: Any){ val store = App.getBoxStore(); if(clazz is List<*> && clazz.size > 0){ val items: List<*> = clazz; val item = items.get(0); val box = store.boxFor(item!!::class.java) box.put(items) } } 它需要一个对象,检查它是否是一个集合,如果是,则需要一个项目来检查集合项目的类,从一个名为ObjectBox的数据库创建一个Box,这个数据库是一个数据库,然后他们把项目列表放在数据库。 但是,我在Box.put statment中得到以下错误: Error:(45, 17) None of the following functions can be called with the arguments supplied: public open fun put(@Nullable vararg p0: Nothing!): […]

覆盖默认构造函数中定义的变量的setter

所以我有一个Kotlin类,看起来像这样: class MyClass { var myString: String = "" set(value) { field = value doSomethingINeed() } constructor(myString: String) { this.myString = myString } } 但是,Android Studio警告我可以将其用作默认构造函数。 当我选择它时,它将其更改为: class MyClass(var myString: String) 现在我失去了重写setter的机会,因为如果我创建一个名为setMyString()的方法,我会得到一个编译器错误。 如果字段是默认构造函数的一部分,是否有方法来覆盖setter,还是必须使用选项1,而忽略我得到的警告?