Я пытаюсь заставить Room ( https://developer.android.com/topic/libraries/architecture/room ) работать со встроенными классами Kotlin, как описано в статье Джейка Уортона « Встроенные классы, которые создают отличные идентификаторы базы данных» :
@Entity
data class MyEntity(
@PrimaryKey val id: ID,
val title: String
)
inline class ID(val value: String)
При составлении этого номера жалуется, что
У сущностей и Pojos должен быть общедоступный конструктор. Вы можете иметь пустой конструктор или конструктор, параметры которого соответствуют полям (по имени и типу).
Глядя на сгенерированный код Java, я нахожу:
private MyEntity(String id, String title) {
this.id = id;
this.title = title;
}
// $FF: synthetic method
public MyEntity(String id, String title, DefaultConstructorMarker $constructor_marker) {
this(id, title);
}
Таинственным образом по умолчанию конструктор является приватным.
При использовании String
в качестве типа для id
(или a typealias
) сгенерированный конструктор класса Java выглядит так, как ожидается:
public MyEntity(@NotNull String id, @NotNull String title) {
Intrinsics.checkParameterIsNotNull(id, "id");
Intrinsics.checkParameterIsNotNull(title, "title");
super();
this.id = id;
this.title = title;
}
Кто-нибудь теперь, как сохранить конструктор по умолчанию общедоступным при использовании встроенных классов в качестве свойств объекта данных?
Ответы:
Я считаю, что причина в том, что класс ID будет представлен как String во время выполнения. Таким образом, дополнительный параметр $ constructor_marker должен гарантировать уникальность подписи конструктора MyEntity (String id, String title), поскольку этот конструктор уже мог быть определен. Но я просто размышляю здесь.
Не могли бы вы попытаться явно определить этот конструктор в классе MyEntity и посмотреть, работает ли он?
источник
data class MyEntity(@PrimaryKey val id: ID, val title: String)