小编dpo*_*sch的帖子

Kotlin接口java类:意外覆盖

我有一个类似的第三方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)

java kotlin

10
推荐指数
1
解决办法
1254
查看次数

Kotlin SAM运行时错误:NoSuchMethodError:没有静态方法

今天我在开发涉及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)

所以我的问题是:

  1. 为什么会发生这种行为?
  2. 如果它正在发生,为什么编译器不会引发错误?

PS:在android中,错误消息看起来与此类似,这更令人困惑:

Caused …
Run Code Online (Sandbox Code Playgroud)

kotlin

5
推荐指数
1
解决办法
566
查看次数

Parse.com 与 TypeScript:扩展 Parse.Object

免责声明:我知道,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)

这样的事情可能吗?我错过了什么吗?

javascript parse-platform typescript

4
推荐指数
1
解决办法
2879
查看次数

gradlew assemble 和 gradlew compile 有什么区别

我注意到

./gradlew tasks
Run Code Online (Sandbox Code Playgroud)

对于我的 android 项目给了我assemble*compile*任务。

有什么不同?

我还注意到该命令列出了任务compileDemoDebugSources以及compileDemoReleaseSources( wheredemo是一种风格,release是一种构建类型)但只是assembleDemo(而不是assembleDemoDebugassembleDemoRelease)——但是后两者工作得一样好。这是为什么?

android gradle

2
推荐指数
1
解决办法
8838
查看次数

标签 统计

kotlin ×2

android ×1

gradle ×1

java ×1

javascript ×1

parse-platform ×1

typescript ×1