将lambda直接分配给inheritance的抽象方法

我是一个BroadcastReceiver的子类,并希望能够指定一个lambda作为输入参数,并直接将其分配为用作“onReceive”的实现。 这是我的代码的样子: class Receiver(val callback: (Context?, Intent?) -> Unit): BroadcastReceiver(){ override fun onReceive(context: Context?, intent: Intent?) = callback fun itWorks(context: Context?, intent: Intent?) = callback } 我想能够像这样实例化它: val myReceiver = Receiver({context: Context?, intent: Intent?-> { println(“Intent received: $intent”) }}) 要么 val myReceiver2 = Receiver(::implementationHere) 但是,我得到以下错误: 错误:(2,18)“onReceive”的返回types不是被重写的成员的公共抽象types的子typesonReceive(p0:android.content.Context!,p1:android.content.Intent!): kotlin.Unit在android.content.BroadcastReceiver中定义’ 有趣的是,当将这个lambda分配给“itWorks”方法时,我没有收到错误。 你能告诉我这两种方法有什么区别吗? 为什么它与一个而不是另一个协同工作? 据我所知,这两种方法的签名是相同的。 (我来自Java8的背景,在哪里(就lambdaexpression式而言)你所关心的只是具有相同的方法签名) 当然这是有效的,但我更喜欢另一种方式: class Receiver2(val […]

如何从generic observable订阅PublishRelay?

科特林代码: fun Observable.circuitBreaker(): Observable { val relay = PublishRelay.create() this.subscribe(relay) return relay.toFlowable(BackpressureStrategy.LATEST).toObservable() } 上面是一个我正试图转换成Swift的Kotlin代码。 但是,我正面临一个错误,说不能将types’PublishRelay’types的值转换为期望的参数types’(Event ) – > Void’ SWIFT代码: extension Observable { func circuitBreaker() -> Observable { let relay = PublishRelay() self.subscribe(relay) return relay.asObservable() } } 任何帮助,将不胜感激。

Android Studio 3.0 Canary 1:Gradle同步错误

我在我的Kotlin项目中遇到这个错误: 这是我的应用程序的Gradle文件: 除了添加Kotlin和Anko的依赖外,我还没有真正做过这个项目。 不知道发生了什么…

未能在新的Android Kotlin项目上运行Instrumented测试

我刚刚创建了一个新的Android应用程序与Kotlin支持。 当我试图运行默认的仪器测试时,它不会运行,并显示给我这个消息: Class not found: “oussaki.com.pos.ExampleInstrumentedTest”Empty test suite. 这是我试图运行的Instrumented测试类: @RunWith(AndroidJUnit4::class) class ExampleInstrumentedTest { @Test fun useAppContext() { // Context of the app under test. val appContext = InstrumentationRegistry.getTargetContext() assertEquals(“oussaki.com.pos”, appContext.packageName) } }

如何简化kotlin函数的默认实现

下面的代码,我总是觉得有点啰嗦。 //judging employee’s salary level, and set a default implemention of the function:whether it > amount fun paidMore(amount: Int, employee: Employee, predicate: (Int, Employee) -> Boolean = { amount, employee -> employee.salary > amount } ): Boolean = predicate(amount, employee) 我想我可以简化这样的代码: fun paidMore(amount: Int, employee: Employee, predicate: (Int, Employee) -> Boolean = employee.salary > amount […]

在kotlin中的elvis操作符.. foo.bar?.let(返回true)?:返回false

下面的代码是做什么的? 如果我用run或apply替换let ,我会得到相同的结果吗? foo.bar?.let(return true)?:return false 这相当于 return foo.getbar() != null 在java中?

SocketException:sendto失败:EBADF(坏文件描述符)

我尝试从Android手机通过套接字发送数据。 我发送PDF文件到打印机进行打印。 在Java中它工作正常,但Kotlin抛出SocketException:sendto失败:EBADF(坏文件描述符),但是用Kotlin代码,打印机无论打印什么。 全堆栈跟踪: java.net.SocketException: sendto failed: EBADF (Bad file descriptor) at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:542) at libcore.io.IoBridge.sendto(IoBridge.java:511) at java.net.PlainSocketImpl.write(PlainSocketImpl.java:500) at java.net.PlainSocketImpl.-wrap1(PlainSocketImpl.java) at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:266) at java.io.OutputStream.write(OutputStream.java:82) at java.io.DataOutputStream.writeBytes(DataOutputStream.java:156) at com.example.print.printerserver.connectors.OutputHelper.writeFooter(OutputHelper.java:22) at com.example.print.printerserver.connectors.PrinterConnector.fillPJL(PrinterConnector.kt:30) at com.example.print.printerserver.connectors.PrinterConnector.access$fillPJL(PrinterConnector.kt:8) at com.example.print.printerserver.connectors.PrinterConnector$print$1.subscribe(PrinterConnector.kt:17) at io.reactivex.internal.operators.single.SingleCreate.subscribeActual(SingleCreate.java:39) at io.reactivex.Single.subscribe(Single.java:2779) at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89) at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452) at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61) at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) […]

Android中的MVVM绑定

我使用Kotlin编写了一个Android应用程序。 在ios的swift中,我已经为MVVM编写了这些代码,但我不知道我可以用于Android view.pullToRefresh.tap.bind(to: viewmodel.didTapRefresh) 当写Rx代码时,我可以使用方法绑定。 但是我无法find与Android相同的东西。 你能告诉我你是如何写在Kotlin这些代码? 谢谢

String属性可以在Kotlin中多久?

我创建了简单的Base64Images助手类,它包含这个主体: companion object{ val ABSTRACT_COLORS = “[image encoded in base64]” } ABSTRACT_COLORS实际上是一个有570438个字符的字符串。 编译期间,我得到了: org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: Failed to generate property ABSTRACT_COLORS … … The root cause was thrown at: ByteVector.java:213 at org.jetbrains.kotlin.codegen.MemberCodegen.genFunctionOrProperty(MemberCodegen.java:205) Caused by: java.lang.IllegalArgumentException 我以为我可以在一个字符串中存储2147483647(2 31 – 1)个字符。 这是为什么? 我发布了下面的这张图片。 你可以使用这个工具来生成base64。 提示:编辑这个类或编译项目冻结Android Studio。 我会用一些轻量级的编辑器编辑和终端来编译它。

Kotlin:使用自定义setter时没有lateinit的解决方法?

在我的活动中,我有一个应该是不可空的字段,并有一个自定义的setter。 我想在我的onCreate方法初始化字段,所以我添加了lateinit到我的variables声明。 但是,显然你不能这样做(目前): https : //discuss.kotlinlang.org/t/lateinit-modifier-is-not-allowed-on-custom-setter/1999 。 这些是我可以看到的解决方法: 用Java的方式来做。 使该字段可以为空并使用null初始化它。 我不想这样做。 使用types的“默认实例”初始化该字段。 这就是我目前所做的。 但是对于某些types来说这太贵了。 有人可以推荐一个更好的方法(这不涉及删除自定义设置)?