android Kotlin领域:类如果包含自定义构造函数,则必须声明不带参数的公共构造函数

mdfafbf1  于 2023-05-15  发布在  Android
关注(0)|答案(6)|浏览(239)

我正在Kotlin中创建一个Realm对象。

领域对象:

open class PurposeModel(var _id: Long?,
                        var purposeEn: String?,
                        var purposeAr: String?) : RealmObject()

当我编译上面的代码时,我得到了这个错误:

error: Class "PurposeModel" must declare a public constructor with no arguments if it contains custom constructors.

我在Kotlin中找不到任何与此相关的问题。我该如何解决这个问题?

holgip5t

holgip5t1#

要清除此错误,必须为属性指定默认值。
像这样更改领域对象:

open class PurposeModel(
    var _id: Long? = 0,
    var purposeEn: String? = null,
    var purposeAr: String? = null
) : RealmObject()

现在它将编译。

原因:

当默认值没有赋值时,它将成为构造函数的参数,Realm需要一个没有参数的公共构造函数。当默认值赋值时,它将成为类的属性。所以你会得到空的构造函数和干净的代码。

n6lpvg4x

n6lpvg4x2#

这就是为什么我更喜欢这样定义它们

open class PurposeModel : RealmObject() {
    @field:PrimaryKey
    var id: Long? = null
    var purposeEn: String? = null
    var purposeAr: String? = null
}
vm0i2vca

vm0i2vca3#

我在我的Ktor服务器上使用Realm,你需要提供一个带有默认值的空构造函数。

@Serializable
class User(
    val id: String,
    var email: String,
    var hashedPass: ByteArray,
) : RealmObject {
    constructor() : this(
        id = ObjectId.create().toString(),
        email = "",
        hashedPass = byteArrayOf()
    ) // Empty constructor for Realm
}

没有它,我得到和错误:

[Realm] Cannot find primary zero arg constructor
aor9mmx1

aor9mmx14#

错误:

_id、目的En、目的Ar未初始化

解决方案

open class PurposeModel(
var _id: Long? = 0,
var purposeEn: String? = "",
var purposeAr: String? = ""
) : RealmObject()
olhwl3o2

olhwl3o25#

对我来说,解决方案是添加abstract关键字,下面是我的工作代码,

@Log4j2
@RunWith(MockitoJUnitRunner::class)
@ExtendWith(MockitoExtension::class)
internal abstract class ItemsManagementControllerTest(
    private val logger: Logger = LoggerFactory.getLogger(
        ItemsManagementControllerTest::class.java
    ) as Logger,
    private var mvc: MockMvc? = null,
    @InjectMocks private val itemsManagementController: ItemsManagementController? = null,
    @Mock private val itemRepository: ItemRepository? = null
) {

删除abstract关键字会使类中的测试用例失败。老实说,我现在不明白为什么。

t3psigkw

t3psigkw6#

您还可以使用Kotlinno-arg插件,它会为您生成一个no-arg构造函数。

相关问题