是否可以强制两个 类 在编译时实现相同的字段名称但类型不同?
Is it possible to enforce two classes to implement the same field names but of differing type at compile time?
假设有两个并行的 classes:
class A(
val stringField: String,
val intField: Int,
val floatField: Float
)
class B(
val stringField: Boolean,
val intField: Boolean,
val floatField: Boolean
)
请注意,两个 class 都有 相同的 字段 names 但它们的 types 不同。
我想知道是否可以在编译时以某种方式强制执行,这样当class A 有一个字段名时它就不会编译class B没有。
在运行时,我可能会使用一些反射来强制执行此操作,但我真的很好奇它是否可以在编译时使用,并且我也不希望为此求助于反射。
编辑 1: 我现在确实看到泛型可能是这里解决方案的一部分,但在实际情况下 class A 有很多领域不同的类型,在 class B 中,所有字段始终都是 Boolean
类型。理想情况下,我不必为 class A
中使用的每个不同字段类型添加通用
编辑 2: 有关手头用例的更多详细信息:
我需要根据一些 Configuration
将 Full
对象转换为 Partial
对象(配置为 false
的字段最终应该是 null
在 Partial
对象中)。这三个 classes 表现出非常相似,这就是为什么我想对它们执行合同(这样它们就不会随着时间的推移而失去同步)。
class Full(
val stringField: String,
val intField: Int,
val floatField: Float,
...
)
class Partial(
val stringField: String?,
val intField: Int?,
val floatField: Float?,
...
)
class Configuration(
val stringField: Boolean,
val intField: Boolean,
val floatField: Boolean,
...
)
这不是编译时检查,但您始终可以编写强制执行此约束的测试。
例如,我编写了一个测试,找到所有用我的 DSL 注释装饰的函数,并验证所有这些函数都在我们的文档中进行了描述(是的!测试文档!)。
您可以使用 reflections 库,它使使用反射更有趣(kotlin-reflect 已经很好但仍然...)。
假设有两个并行的 classes:
class A(
val stringField: String,
val intField: Int,
val floatField: Float
)
class B(
val stringField: Boolean,
val intField: Boolean,
val floatField: Boolean
)
请注意,两个 class 都有 相同的 字段 names 但它们的 types 不同。
我想知道是否可以在编译时以某种方式强制执行,这样当class A 有一个字段名时它就不会编译class B没有。
在运行时,我可能会使用一些反射来强制执行此操作,但我真的很好奇它是否可以在编译时使用,并且我也不希望为此求助于反射。
编辑 1: 我现在确实看到泛型可能是这里解决方案的一部分,但在实际情况下 class A 有很多领域不同的类型,在 class B 中,所有字段始终都是 Boolean
类型。理想情况下,我不必为 class A
编辑 2: 有关手头用例的更多详细信息:
我需要根据一些 Configuration
将 Full
对象转换为 Partial
对象(配置为 false
的字段最终应该是 null
在 Partial
对象中)。这三个 classes 表现出非常相似,这就是为什么我想对它们执行合同(这样它们就不会随着时间的推移而失去同步)。
class Full(
val stringField: String,
val intField: Int,
val floatField: Float,
...
)
class Partial(
val stringField: String?,
val intField: Int?,
val floatField: Float?,
...
)
class Configuration(
val stringField: Boolean,
val intField: Boolean,
val floatField: Boolean,
...
)
这不是编译时检查,但您始终可以编写强制执行此约束的测试。
例如,我编写了一个测试,找到所有用我的 DSL 注释装饰的函数,并验证所有这些函数都在我们的文档中进行了描述(是的!测试文档!)。
您可以使用 reflections 库,它使使用反射更有趣(kotlin-reflect 已经很好但仍然...)。