Kotlin NullPointerException发生

我是新来的 科特林 ,当我开始空安全时,我迷惑了下面的情况。 在初始化方面有一些数据不一致的地方(在某个地方使用了一个未初始化的构造函数)。 任何人都可以更详细地描述情况吗?

Kotlin泛型继承

我有一个基类Base,两个特性让我们说Trait1和Trait2。 我想用这三样东西写一个参数化的类。 在斯卡拉我做: class C[T <: Base with Trait1 with Trait2] { … } 在kotlin我试着: class C<T : Base, Trait1, Trait2> { … } 但它不好,Trait1和Trait2是更多的类型参数。 有没有办法写这个?

Kotlin接口的一个java类:意外覆盖

我有一个类的第三方Java库 public class ThirdParty { public String getX() { return null; } } 我也有一个类似kotlin的界面 interface XProvider { val x: String? } 现在我想扩展ThirdParty类并实现XProvider接口。 这一直在我遗留的java代码中工作正常: public class JavaChild extends ThirdParty implements XProvider {} 但是,我想写尽可能多的kotlin,并试图将我的java类转换为kotlin。 可悲的是,以下不起作用: class KotlinChild: ThirdParty(), XProvider 错误是 class 'KotlinChild1' must be declared abstract or implement abstract member public abstract val x: String? defined in […]

Kotlin数组初始化函数

我是Kotlin的新手,难以理解init函数如何在Array的上下文中工作。 具体来说,如果我试图使用以下String类型的数组: val a = Array<String>(a_size){"n = $it"} 这工作,但是"n = $it"是什么意思? 这看起来不像init函数,因为它在大括号内而不在括号内。 如果我想要一个Int数组, init函数或者大括号里面的部分是什么样的?

将RxJava代码正确转换为Kotlin

我正在学习Kotlin和RxJava。 我在Java中拥有这样的代码: public class MainActivity extends AppCompatActivity { private HashMap<String, Object> cacheToInsertToDb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); cacheToInsertToDb = new HashMap<>(); Observable.interval(1, TimeUnit.SECONDS) .take(30) // up to 30 items .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<Long>() { @Override public void accept(Long aLong) throws Exception { cacheToInsertToDb.put(aLong+"", aLong); Log.d("Observable", cacheToInsertToDb.values().toString()); } }, new Consumer<Throwable>() { @Override public […]

Kotlin:“return @”是什么意思?

我在我的一个项目中使用了RxJava,我使用Android Studio插件将其中的一个类转换为Kotlin,在flatMap lambda(java中的Func1)之一中,中间体返回类似于下面的@Func1 。 我不知道这是什么意思。 something.flatMap(Func1<ArticleCriteria, Observable<Pair<String, String>>> { val isTemporaryClone = it.isATemporaryClone val isTheOriginalToken = it.tokenIsOriginalHere if (isTemporaryClone) { if (!isTheOriginalToken) { return@Func1 paramsError("Token is always original for temp articles") } return@Func1 mJobRunner.doNotRun(DeleteArticleJob.TAG) .doOnNext(deletePersonalActionById(articleId)) } runArticleJobAsync(DeleteArticleJob.TAG, it) })

Kotlin数据类杰克逊@JsonProperty没有兑现

我使用Kotlin数据类将Feign连接到POST。 我打电话的API期望{…“brandInfo”:{“TPID”:1} …} 我的理解是,如果jackson-module-kotlin的依赖没有被正确拾取,Feign将根本无法开启POST,因为Jackson编码将会彻底失败。 然而,Feign能够发布,杰克逊能够编码,但不管我做什么,发布的是{…“brandInfo”:{“tpid”:1} …},尽管brandInfo val被注释@JsonProperty(“TPID”)。 我错过了什么? @JsonIgnoreProperties(ignoreUnknown = true) data class KBrandInfo ( @JsonProperty("TPID") //not honored val TPID: Long ) interface KConversationServiceClient { @RequestLine("POST v2/conversations") @Headers("Content-Type: application/json") fun createConversation(createConversation: KCreateConversation): String } @Provides public KConversationServiceClient getKConversationServiceClient( @Named("conversationServiceUrl") String baseUri, Feign.Builder builder) { return builder .logLevel(Logger.Level.FULL) .decoder(new StringDecoder()) .encoder(new JacksonEncoder(jacksonObjectMapper())) //does this need some […]

使用Kotlin函数作为Java SAM类型

从一个期望SAM(单抽象方法)类型参数的Java API调用方法时,是否存在一种将函数文本强制转换为正确类型的一致方法? 我发现有时Kotlin的功能工作得很好,其他人也不是没有看起来一致。 我有几个来自Ratpack API的例子: 当使用Kotlin函数直接调用ChainAction.handler(String, Handler)可以正常工作,例如: handler("foo") { context -> context!!.render("from the foo handler") } 类型推断拿起context是一个ratpack.handling.Context? 正确。 另一方面,我试图调用Guice.handler(LaunchConfig, Action<? super ModuleRegistry>, Action<? super Chain>) ,并且不知道如何让Kotlin函数代替第二个参数。 这是否使生活困难的泛型? 也许我期待Kotlin做一些不是为了设计的东西,但是第一个例子表明,至少有一些 SAM类型的强制是可能的(Kotlin对Ratpack Handler乐趣)。

Kotlin可为空的变量赋值

在Kotlin中,这个代码是否有更简短的语法: if(swipeView == null){ swipeView = view.find<MeasureTypePieChart>(R.id.swipeableView) } 首先我试过这个: swipeView ?: view.find<MeasureTypePieChart>(R.id.swipeableView) 但后来我意识到这不是一个任务,所以代码什么都不做。 然后我试着: swipeView = swipeView ?: view.find<MeasureTypePieChart>(R.id.swipeableView) 哪个工作,但有点冗长。 我会期待这样的事情: swipeView ?= view.find<MeasureTypePieChart> 但不幸的是,这是行不通的。 有没有什么办法用一个简短的语法来完成这个? 我知道我可以这样做: variable?.let { it = something } which works.

如何访问Kotlin中的“Activity.this”?

我有这样的Java代码: MaterialDialog builder = new MaterialDialog.Builder(MainActivity.this) 我想获取Kotlin中的MainActivity对象。 MainActivity.this自动转换。