Tag: 构造函数

Kapt generatestubs – 不能用单元测试的内部构造函数初始化对象

假设我们有一个kotlin类定义为: package foo class Bar internal constructor() { //… } 当我尝试从一个测试方法,如: package foo class TestBar { @Test fun testingBar() { Bar() //<—– error } } 我收到以下错误: Cannot access '<init>': it is internal in 'Bar' Bar和TestBar都在同一个AndroidStudio模块中(android库)源代码的两个路径都是在gradle中定义的: … sourceSets { main.java.srcDirs += 'src/main/kotlin' test.java.srcDirs += 'src/test/kotlin' } … 测试似乎一般工作正常,但我无法创建任何与内部构造函数的对象。 我在用着: ext.kotlin_version = '1.1.3-2' 编辑 感谢您的反馈。 我决定从头开始制作简单的android多模块应用程序,它工作得很好。 然后,我试图摆脱我的模块依赖关系一个接一个,事实证明,问题是由dagger2 […]

扩展类条件分支超值的Kotlin二级构造函数

你如何根据第四个二级构造函数中的值有条件超级调用? 为什么这不工作? open class SecondaryConstructors{ constructor(i:Int) constructor(s:String) } class SecondaryExtended:SecondaryConstructors { constructor(i:Int):super(i) constructor(s:String):super(s) constructor():super(if(true)1 else 0) constructor(intOrString:Boolean):super( if(intOrString) 3 else "hey") // conditional branch result of int/string is implicitly cast to Any // error – none of the following functions can be called with the arguments supplied }

在构造函数中调用super并在Kotlin中分配一个字段?

我想初始化status字段里面的构造函数除了调用super 。 class MyException : RuntimeException { init { val status: Status } constructor(status: Status) : super() constructor(status: Status, cause: Throwable) : super(cause) } 我怎样才能做到这一点?

Kotlin Poet空构造函数的生成 – 继承

我试图打印使用KotlinPoet的超类的构造函数的调用。 我目前(不编译)输出是: open class NameOfASubclass : NameOfSuperclass { } 为了使我的代码编译我需要(以某种方式)要么打印 open class NameOfASubclass : NameOfSuperclass() { } 要么 open class NameOfASubclass : NameOfSuperclass { constructor() } 我无法使用KotlinPoet来实现。 有任何想法吗?

构造函数使用可变参数在kotlin中调用

有没有什么办法可以调用构造函数使用可变参数没有硬编码数组参数( datain[0] , datain[10]等)。 例如, constructor(vararg datain:String): this(datain[0],datain[1],datain[2]){ } 目前我打电话是这样的: public class parent(var var1:String, var var2:String){ } public class child(var var3:String, var1:String, var2:String): parent(var1,var2){ constructor(vararg datain:String): this(datain[0],datain[1],datain[2]){ } }

kotlin,如何简化向基类构造函数传递参数?

我们有一个包,我们正在寻求从python转换为kotlin,然后才能够使用该包迁移系统。 在这个包里面有一组类,它们是所有的变体,或者是一个公共基类的“风味”。 大部分代码都在基类中,它有大量的可选参数。 所以考虑: 打开class BaseTree(val height:Int = 10,val root:Boolean = true,// ……更多! class FruitTree(val fruitSize, height:Int=10, roots:Boolean=true, // now need all possible parameters for any possible instance ):BaseTree(height=height, roots=roots //… yet another variation of same list 代码实际上不是树,我只是认为这是一个简单的方式来传达这个想法。 基类有大约20个参数,大约有10个子类,每个子类有效地需要从基类重复相同的两个变量参数列表。 一个真正的噩梦,如果参数列表改变! 那些来自Java背景的人可能会评论“20个参数太多”,可能会错过这是可选参数 ,这是影响设计方面的语言特性。 20个必需的参数是疯狂的,但是10个或者甚至20个可选参数并不罕见,例如检查sqlalchemy表 。 在python中,你可以调用基类的构造函数: def __init__(self, special, *args, **kwargs): super().__init(*args, **kwargs) # pass all […]

在Kotlin中定义具有属性的默认构造函数和辅助构造函数

我正在尝试在Kotlin中创建一个简单的POJO(POKO?)类,使用默认的空构造函数和带有参数的辅助构造函数, 这不会给我firstName和lastName属性: class Person() { constructor(firstName: String?, lastName: String?) : this() } 这给了我的属性,但是它们在实例化之后没有设置: class Person() { constructor(firstName: String?, lastName: String?) : this() var firstName: String? = null var lastName: String? = null } 这给了我一个编译错误,说“var'在二级构造参数是不允许的。”: class Person() { constructor(var firstName: String?, var lastName: String?) : this() } 那么,这是如何完成的? 我怎样才能有一个默认的构造函数和二级构造函数的参数和属性?

这种类型有一个构造函数,必须在这里初始化 – Kotlin

我刚开始使用Kotlin试验Android应用程序。 我只是想继承像这样的应用程序类: class SomeApp : Application { } 但是编译器提出了这样的警告: 并建议将其更改为: class SomeApp : Application() { override fun onCreate() { super.onCreate() } } 我阅读了文档中的主要和次要构造函数 。 所以,如果超类有一个主要的构造函数,那么是否有必要写在这里? 像Application类有它自己的构造函数 public Application() { super(null); } 那么有必要有派生的主要构造函数? 或者我不能像Java那样做一些事情: class SomeApp : Application { constructor SomeApp(){ super(); } } 或者这个错误提示了别的东西? 任何人都可以详细解释我吗? 我对这门语言很陌生,这对我来说很奇怪。 编辑:在Java我可以做到以下几点: class SomeApp extends Application{ } 它有隐含的构造函数,所以我不必写: class SomeApp […]

Kotlin – 具有不同参数的辅助构造函数

在将一个相当简单的应用程序从Java转换到Kotlin我遇到了一个我无法解决的问题。 我有一个类似的ScanInfo类似Java(没有getters和setter) public class ScanInfo { private String source; private String label_type; private String data; public ScanInfo(Intent intent) { … Get Info from intent and assign the values … this.source = … this.label_type = …. this.data = …. } } 现在在Kotlin我可以创建课程 class ScanInfo (var source: String, var label_type: String, var data: String) 但我不知道如何让它工作,所以我可以用Intent作为参数创建一个ScanInfo对象。 我尝试与同伴,对象,伴侣对象,但我似乎无法找到正确的语法。 我在使用Kotlin时寻找这样的解决方案是错误的,还是我没有使用正确的kotlin-constructor […]

何时使用lateinit,init块和companion对象。 Kotlin

我正在从开发人员的网站的Android蓝牙聊天项目,我正在尝试使用Kotlin而不是Java。 我是Kotlin的新手,我只是对使用我的init块和lateinit关键字以及我的伴侣对象的“正确”方式有些混淆。 在我张贴的代码我没有伴侣对象,但我想知道如果我应该。 到目前为止,我主要只是使用伴侣对象来模仿java的静态类成员,或者有时包含类常量。 至于我的init块我基本上是用于构造函数。 也就是通过类声明中定义的实际构造函数传入的成员的赋值。 至于lateinit,我用这个来声明我不想立即初始化的成员,也不想做空。 请让我知道如果这是正确的用法或事情的改变,如果它不是。 这是我的代码: inner class AcceptThread(val secure:Boolean) : Thread(){ lateinit var mmServerSocket:BluetoothServerSocket lateinit var mSocketType:String init { var tmp:BluetoothServerSocket? = null mSocketType = if (secure) "Secure" else "Insecure" try { if (secure){ tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE, UUID_SECURE) } else{ tmp = mAdapter.listenUsingInsecureRfcommWithServiceRecord(NAME_INSECURE, UUID_INSECURE) } }catch (ioe:IOException){ Log.e(TAG, "Socket Type: $mSocketType […]