以下不起作用,但希望能帮助您理解我的意思:
class Example<T : DataClass>
Run Code Online (Sandbox Code Playgroud)
如果你想知道我想要完成什么,这就是我想到的一个例子:
class Repository<T> where T : Entity, // Entity defines mutable property 'id'
T : DataClass {
// assume there is a map here
fun add(obj: T) {
val copy = obj.copy(id = generateID())
map.put(copy.id, copy)
}
}
Run Code Online (Sandbox Code Playgroud)
或者有更好的方法来完成我想要做的事情吗?
在Android应用程序中,我需要使用单个抽象级别对Kotlin数据类的Json数据进行反序列化.但我不知道在构造函数中放置正确的属性.
作为一个简单的版本,让我说我有一个形状:
abstract class Shape(open val x: Int, open val y: Int)
Run Code Online (Sandbox Code Playgroud)
有两个推导
data class Circle(val radius: Int, override val x: Int, override val y: Int): Shape(x, y)
Run Code Online (Sandbox Code Playgroud)
和
data class Square(val width: Int, override val x: Int, override val y: Int): Shape(x, y)
Run Code Online (Sandbox Code Playgroud)
所以我的目标是,不要实例化一个Shape.因此,请始终反序列化其派生.后来我需要在其他类中处理一些集合属性,例如:
val shapes: List<Shape>
Run Code Online (Sandbox Code Playgroud)
但我还必须知道每个元素的派生类型.
当我尝试用Gson反序列化给定的例子时
val square = gson.fromJson(SQUARE_JSON, Square::class.java)
Run Code Online (Sandbox Code Playgroud)
我总是得到一个IllegalArgumentException
java.lang.IllegalArgumentException: class com.example.shapes.model.Square declares multiple JSON fields named x
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:170)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
at com.google.gson.Gson.getAdapter(Gson.java:423)
at com.google.gson.Gson.fromJson(Gson.java:886)
at com.google.gson.Gson.fromJson(Gson.java:852)
at com.google.gson.Gson.fromJson(Gson.java:801)
at com.google.gson.Gson.fromJson(Gson.java:773)
Run Code Online (Sandbox Code Playgroud)
是否有可能在不编写自定义Gson …
我是Kotlin的新手,我不知道为什么编译器会抱怨这段代码:
data class Test(var data : String = "data")
fun test(){
var test: Test? = Test("")
var size = test?.data.length
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨test?.data.length,它说我应该这样做:test?.data?.length.但数据变量String不是String?,所以我不明白为什么我要把它放在?我想检查长度的时候.
我是 Kotlin 的初学者,我看过一些关于数据类的示例代码,似乎参数都是 val 类型,就像代码 A
我需要改变数据类MSetting的一些值,所以我设计了Code B,你能告诉我Code B是不是好方法?
代码 A
data class MSetting (
val _id: Long,
val name: String,
val createdDate: Long,
val description: String
)
Run Code Online (Sandbox Code Playgroud)
代码 B
data class MSetting (
var _id: Long,
var name: String,
var createdDate: Long,
var description: String
)
Run Code Online (Sandbox Code Playgroud) 我有一个数据类,我Entity从它为我的数据库创建了一个。
这是我的数据类:
@Entity
@Parcelize
data class Tapligh(
@PrimaryKey(autoGenerate = true)
var id: Long,
@SerializedName("title") var title: String?,
@SerializedName("type") var type: Int?,
@SerializedName("os") var os: Int?,
@SerializedName("logo") var logo: String?,
@SerializedName("template") var template: String?,
@SerializedName("action") var action: String?,
@SerializedName("date") var date: String?,
@Embedded
@SerializedName("videos") var videos: Videos?,
) : Parcelable {
fun getTaplighType(): Int {
return when (this.type) {
0 -> TaplighType.IMAGE.type
1 -> TaplighType.VIDEO.type
else -> TaplighType.NATIVE.type
}
}
}
@Parcelize
data class Videos(
@SerializedName("land") var land: String?, …Run Code Online (Sandbox Code Playgroud) 我有一个带有默认值的 kotlin 数据类,当我尝试使用 MapStruct 映射它时,它会在运行时抛出错误,因为它会尝试将 null 值分配给具有默认值的属性的不可空类型。我知道在 @Mapping 注释中分配默认值,但是 MapStruct 有没有办法考虑数据类默认值,而不是我必须这样做两次?
这是例子:
data class A(val property1: String = "prop 1", val property2: String)
data class B(val property2: String)
@Mapper
interface SomeMapper {
...
fun mapBtoA(b: B): A
}
val b = B("prop 2 val")
val a: A = SomeMapper.INSTANCE.mapBtoA(b)
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,它将尝试将 null 分配给 property1 而不是 prop 1 默认值。
我在Kotlin中使用数据类来显着减少我不得不写的Java代码量.
但是,在我的一个Java类中,我不知道如何在Kotlin中实现相同的结果.
我的Java类看起来有点像这样:
public class DataObject {
private int mId;
private String mName;
public DataObject(int id, String name) {
mId = id;
mName = name;
}
public DataObject(Context context, int id) {
mId = id;
Cursor cursor = ...
cursor.moveToFirst();
mName = cursor.getString(...);
cursor.close();
}
public int getId() {
return mId;
}
public String getName() {
return mName;
}
}
Run Code Online (Sandbox Code Playgroud)
我试图在Kotlin中重写它,到目前为止我有这个:
data class DataObject(val id: Int, val name: String) {
constructor(context: Context, id: Int) : this(id, fetchName(context))
private fun fetchName(context: …Run Code Online (Sandbox Code Playgroud) 我有几个数据类,其中包括一个var id: Int?字段.我想在接口或超类中表达它,并且有数据类扩展它并id在构造时设置它.但是,如果我试试这个:
interface B {
var id: Int?
}
data class A(var id: Int) : B(id)
Run Code Online (Sandbox Code Playgroud)
它抱怨我压倒了这个id领域,我是哈哈.
问:A在这种情况下,我如何让数据类在id构造时使用它,并设置id在接口或超类中声明的数据类?
class Animal {
val name: String
constructor(name: String){
this.name = name // initialized via constructor
}
}
Run Code Online (Sandbox Code Playgroud)
对于上面的类,Kotlin我能够通过辅助构造函数初始化val属性,但Data类不允许这样做
data class User(val name: String, val postalCode: Int) {
val email: String
constructor( email: String): this("", 1){
this.email = email // error: value can not be reassigned
}
}
Run Code Online (Sandbox Code Playgroud)
我无法理解的是,电子邮件属性已经初始化,因为我还没有声明任何初始化?
有没有办法从 Kotlin 类/数据类自动生成 JSON 模式或 Protobuf 模式?我有一个 android 项目,我希望能够在 TypeScript 和 Swift 中使用我的数据模型类,而无需再次编写它们。由于存在从 JSON 模式到几乎所有编程语言的转换器,我想将 Kotlin 类转换为 JSON 模式就可以了。
data-class ×10
kotlin ×10
android ×3
inheritance ×2
json ×2
android-room ×1
generics ×1
gson ×1
java ×1
mapstruct ×1
model ×1
properties ×1
schema ×1