当前位置: 首页 > 知识库问答 >
问题:

有多个好的构造函数,Room将选择无参数构造函数。如何解决此警告

江棋
2023-03-14

我试图在androidkotlin项目中实现Room持久数据库库,但在编译时捕捉到了这个警告。我不知道如何解决这个问题。

警告:有多个好的构造函数,房间将选择无参数构造函数。您可以使用@Ignore注释来消除不需要的构造函数。

自动生成类

public final class Gender {
             ^

Kotlin数据类

import android.arch.persistence.room.Entity
import android.arch.persistence.room.PrimaryKey

@Entity
data class Gender(@PrimaryKey(autoGenerate = true)
             var genderId: Int = 0,
             var type: String = "")

共有3个答案

空翼
2023-03-14

这里的“问题”是,kotlin正在为类生成多个构造函数,因为某些属性有默认参数。

就您而言,您有:

// this is the synthetic one, don't worry to much about it
public Gender(int var1, String var2, int var3, DefaultConstructorMarker var4) { /* some implementation */ }

// the "default" one, that can be called when you are delegating to the default params
public Gender() { /* some implementation */ }

// the one that gets all the params
public Gender(int genderId, @NotNull String type) { /* some implementation */ }

房间可以使用没有参数的房间,也可以使用有两个参数的房间,它选择其中一个(并通过警告告诉您)

您可以删除类型的默认参数,并且只有一个(非合成)构造函数:

// still synthetic
public Gender(int var1, String var2, int var3, DefaultConstructorMarker var4) { /* some implementation */ }

// this is the only usable constructor now
public Gender(int genderId, @NotNull String type) { /* some implementation */}

现在房间只有一个构造函数可以使用,所以它会很高兴地使用它。

如果您的用例允许,您可以删除默认值。请注意,您只能对非基元类型执行此操作,这会使您的API更好。

我不知道您的具体情况,但请注意,您也可以使用val而不是var

@Entity
data class Gender(
    @PrimaryKey(autoGenerate = true)
    val genderId: Int = 0,  // so callers don't need to specify an id. Room will generate one if it gets a 0 here
    var type: String
)

姬振
2023-03-14

试试这个:

import android.arch.persistence.room.Entity
import android.arch.persistence.room.PrimaryKey

@Entity
class Gender @Ignore constructor(@PrimaryKey(autoGenerate = true)
             var genderId: Int = 0,
             var type: String = "") {

    constructor() : this(0, "")
}

就像警告说的

(...) 房间将选择无参数构造函数。(...)

您的构造函数有两个参数。您需要添加一个空的,而忽略另一个

融建树
2023-03-14

我有同样的警告,我只是把@Ignore放在空构造函数之前

// Empty constructor
@Ignore
public Room_Database() {
}
 类似资料:
  • 我正在浏览hibernate留档,文档说hibernate需要为我们所有的持久类提供一个no-arg构造函数: 无参数构造函数是所有持久类的要求;Hibernate必须使用Java反射为您创建对象。构造器可以是私有的,但是在没有字节码插装的情况下,运行时代理生成和有效的数据检索需要包或公共可见性。 但是当我通过创建一个没有任何无参数构造函数的POJO类并放置一个接受参数的构造函数来创建一个示例程序

  • 我的问题是关于OOP(C)中的构造函数。当我在一个类中将默认构造函数定义为private,并且在main中将该类的一个对象初始化为default时,就会出现默认构造函数不可访问的错误。这很好。但我也在Public部分中使用默认参数构造函数,当我再次在main中初始化对象时,就会出现对函数重载的不明确调用。所以我的问题是,如果不能从main访问私有构造函数,那么编译器应该调用公共部分中的构造函数,这

  • 实际上,我不明白无参数构造函数和默认构造函数的区别是什么。 在创建名为cFrame的Test对象时,是否调用此类的默认构造函数?

  • JavaScript 中的构造函数和其它语言中的构造函数是不同的。 通过 new 关键字方式调用的函数都被认为是构造函数。 在构造函数内部 - 也就是被调用的函数内 - this 指向新创建的对象 Object。 这个新创建的对象的 prototype 被指向到构造函数的 prototype。 如果被调用的函数没有显式的 return 表达式,则隐式的会返回 this 对象 - 也就是新创建的对象

  • 问题内容: 我在一个Activity中有一个IntentService,当我尝试调用该服务时,它将引发此错误,我发现这很奇怪,因为如果我声明了空的构造函数。 错误: AndroidManifest.xml 活动: 问题答案: 你是一个内部阶级。如果要将其保留在内部,请将其更改为static: 您可能需要阅读不同类型的嵌套类。google的第一个链接:http : //docs.oracle.com

  • 真的不可能在 dart 中为一个类创建多个构造函数吗? 在我的播放器类中,如果我有这个构造函数 然后我尝试添加这个构造函数: 我得到以下错误: 默认构造函数已定义。 我不是通过创建一个带有一堆非必需参数的构造函数来寻找解决方法。 有没有好办法解决这个问题?