我有一个类似的第三方java库
public class ThirdParty {
public String getX() {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
我在kotlin中也有一个界面
interface XProvider {
val x: String?
}
Run Code Online (Sandbox Code Playgroud)
现在我想扩展ThirdParty类并实现XProvider接口.这在我的遗留Java代码中运行良好:
public class JavaChild extends ThirdParty implements XProvider {}
Run Code Online (Sandbox Code Playgroud)
但是,我想写尽可能多的kotlin并尝试将我的java类转换为kotlin.可悲的是,以下不起作用:
class KotlinChild: ThirdParty(), XProvider
Run Code Online (Sandbox Code Playgroud)
错误是
class 'KotlinChild1' must be declared abstract or implement abstract member public abstract val x: String? defined in XProvider
Run Code Online (Sandbox Code Playgroud)
但是,如果我做的话
class KotlinChild1: ThirdParty(), XProvider {
override val x: String? = null
}
Run Code Online (Sandbox Code Playgroud)
我明白了
error: accidental override: The following declarations have the …Run Code Online (Sandbox Code Playgroud) 今天我在开发涉及SAM转换和子类的kotlin/android时遇到了一个非常奇怪的运行时错误.
这是纯java + kotlin的最小例子.这是两个java类:
public class A {
public interface I {
public void f();
}
public I i;
}
public class B extends A {}
Run Code Online (Sandbox Code Playgroud)
这是一个kotlin主要功能:
fun main(args: Array<String>) {
A().i = B.I {}
}
Run Code Online (Sandbox Code Playgroud)
这段代码编译得很好,但在运行时我收到以下错误:
Exception in thread "main" java.lang.NoSuchMethodError: B.I(Lkotlin/jvm/functions/Function0;)LA$I;
at MainKt.main(Main.kt:2)
Run Code Online (Sandbox Code Playgroud)
现在,这已经很糟糕了 - 如果像这样的代码不起作用(我猜不会),编译器应该引发错误.但至少有一个人可能会说I通过子类B而不是定义的位置引用接口是个坏主意A(即A.I).
但是,如果此代码位于B我可以I直接引用的子类中,则不太清楚I:
class C: B {
constructor() {
this.i = I {}
}
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
PS:在android中,错误消息看起来与此类似,这更令人困惑:
Caused …Run Code Online (Sandbox Code Playgroud) 免责声明:我知道,Parse.com 关闭了它的托管服务。尽管如此,我们将继续使用该框架一段时间,所以这个问题对我们来说仍然很重要。
最近,我开始玩弄 TypeScript,并认为它可以大大提高我解析云代码的效率。所以我做了一些测试,并且成功地能够使用typescript来编写云函数等等。我什至包括了通过打字进行解析的打字定义。
但是,我仍然没有得到一件事:如何以类型安全的方式扩展 Parse.Object?
在普通的 js 中,我会写:
var Foo = Parse.Object.extend("Foo", {
// instance methods
}, {
// static members
});
Run Code Online (Sandbox Code Playgroud)
为了获得类型安全,我想在打字稿中写这样的东西:
class Foo extends Parse.Object {
// static members
// instance methods
}
Run Code Online (Sandbox Code Playgroud)
这样的事情可能吗?我错过了什么吗?
我注意到
./gradlew tasks
Run Code Online (Sandbox Code Playgroud)
对于我的 android 项目给了我assemble*和compile*任务。
有什么不同?
我还注意到该命令列出了任务compileDemoDebugSources以及compileDemoReleaseSources( wheredemo是一种风格,release是一种构建类型)但只是assembleDemo(而不是assembleDemoDebug和assembleDemoRelease)——但是后两者工作得一样好。这是为什么?