Tag: 科特林

惰性成员的惰性初始化

如果我们有一个成员variables定义为 private var foo: Foo? = null 当我们调用带有参数的方法(需要初始化Foo)时,我们想要初始化它,还有更好的方法吗? fun generateFoo(bar: Bar): Foo { var localFoo = foo if (localFoo == null) { localFoo = Foo(bar) foo = localFoo } return localFoo } 我正在考虑避免所有的variables赋值。 编辑:稍微短一点的版本在这里,但仍然不理想 fun generateFoo(bar: Bar): Foo { var localFoo = foo ?: Foo(bar) foo = localFoo return localFoo }

在Kotlin中如果不是null,则返回原地方式

我正在寻找一种惯用的方式来返回如果不是null在Kotlin中的variables。 例如,我想要的东西如: for (item in list) { getNullableValue(item).? let { return it } } 但是不可能在Kotlin的一个区块里面回来。 有没有一个好办法做到这一点,而不必这样做: for (item in list) { val nullableValue = getNullableValue(item) if (nullableValue != null) { return nullableValue } }

Kotlin – 在循环解构不工作 – var不可访问

一些背景 : val (name, age) = person 这个语法被称为解构声明。 它在同一时间创建多个variables( 更正,创建多个值 )。 解构声明也适用于for循环:当你说: for ((a, b) in collection) { … } 让我们看看我有一个列表项: @Parcelize data class MyModel( var name: String = “”, var is_locked: Boolean = true, var is_one_size: Boolean = false, ) : Parcelable 现在我已经获得了“MyModel”类的列表,我试图循环他们像这样: private fun initMyModelList(model: MutableList) { //i want to access is_locked from […]

在Kotlin中有两个types参数个数不同的函数

这两个function相互冲突。 有没有解决这个问题的方法? inline fun foo() = … inline fun foo() = … 谢谢! 编辑: 我发现方便(至少对我来说)这个问题的解决方案: inline fun foo() = foo() inline fun foo(type1: KClass = T::class, type2: KClass = I::class) = … 如果您选择仅添加一个参数,则可以更简洁。 以后你可以像这样使用它: val x = foo() val y = foo() 这就是我所需要的。

属性getter在Supertype上输入,而不是在Kotlin中执行

假设我有两个类,一个Base和一个扩展Base的Impl 。 package mypackage open class Base class Impl : Base() 我将如何创建一个私有属性的具体Impltypes(内部使用) ,与一个公共的getter键入为Basetypes ,实现多态? 我最初的方法是这样的: class Test { private val myType = Impl() get():Base } 但是,Kotlin编译器抱怨: 错误:(30,11)Kotlin:Getter返回types必须等于属性的types,即’mypackage.Impl’ 基本上,这就是它在普通Java中的样子: public class Test { private Impl myImpl = new Impl(); public Base getBase() { return myImpl; } } 怎么能做到这一点? 我错过了什么吗? PS我知道Backing Fields和创建自定义方法作为getter的解决方法,我只是好奇如何以优雅,Kotlin风格的方式来处理这个问题。

Kotlin:单一财产与多个不同types的制定者

我试图建立一个具有LocalDatetypes属性的类,它具有接受不同types的setter: LocalDate或String 。 在LocalDate情况下,值被直接分配,在String情况下,它被解析,然后分配。 在Java中,我只需要实现两个处理上述情况的重载setter。 但我不知道如何处理在Kotlin。 我试过这个: class SomeExampleClass(var _date: LocalDate) { var date = _date set(value) { when(value) { is LocalDate -> value is String -> LocalDate.parse(value) } } } 它不编译。 我该如何解决这个问题?

把这个java代码翻译成kotlin的最好方法

URL url = new URL(urlSpec); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); InputStream in = connection.getInputStream(); int bytesRead = 0; byte[] buffer = new byte[1024]; while ((bytesRead = in.read(buffer)) > 0) { out.write(buffer, 0, bytesRead); } out.close(); 我特别好奇这个部分 while(bytesRead = in.read(buffer)) 我们知道asigements在kotlin中被视为语句,而在java中则被视为expression式,所以这个构造只能在java中使用。 将这个java代码转换成kotlin的最好方法是什么?

有没有办法编写一个扩展函数来改变对象的值?

在我的情况下,我想改变一个原始的布尔 我从来不喜欢以下types的代码: private var firstTime: Boolean = true … if (firstTime) { // do something for the first time here firstTime = false } 会很好,如果我可以有一个扩展function,如: if (firstTime.checkAndUnset()) { // do something for the first time here } 这可能吗?

用协变types替换带有lambda的SAM构造函数

我有以下的Java接口: interface Action1 { void call(T t); } interface Test { void test(Action1 action) } 以下Kotlin课程: interface A { fun go() } abstract class Main { abstract fun a(): Test fun main() { a().test(Action1 { it.go() }) a().test { it.go() } } } 现在在函数main ,第一个语句编译,但是IntelliJ给出了一个警告,即SAM构造函数可以用lambda替换。 这将导致第二个陈述。 但是,这第二个语句不能编译,因为it具有typesAny? ,而不是A 删除out修饰符使其再次编译。 为什么会发生? 这个用例是当Main的实现类需要返回函数a() Test ,其中B实现了A : class […]

没有types注释的Kotlin函数参数

在Kotlin上,当定义方法时,函数的参数需要types注释。 在我的情况下,我有一个接口的两个类。 interface Base{ fun method() } class DervA():Base{ fun override method(){ … } } class DervB():Base{ fun override method(){ … } } 而且,我希望从其他函数调用他们的方法 fun test_method(inst){ inst.method() } 但是,Kotlin编译器却抱怨:“一个值参数需要一个types注解”。 我应该为每个类定义“test_method”吗? fun test_method_for_DervA(inst:DervA){ inst.method() } fun test_method_for_DervB(inst:DervB){ inst.method() } 你有更聪明的方法吗?