3

假设有两个并行类:

class A(
        val stringField: String,
        val intField: Int,
        val floatField: Float
)

class B(
        val stringField: Boolean,
        val intField: Boolean,
        val floatField: Boolean
)

请注意,两个类具有相同的字段名称,但它们的类型不同。

我想知道是否可以在编译时以某种方式强制执行,以便当 A 类具有 B 类没有的字段名称时它不会编译。

在运行时我可能会使用一些反射来强制执行此操作,但我真的很好奇它是否可能在编译时进行,并且也不想为此求助于反射。

编辑 1:我现在确实看到泛型可能是这里解决方案的一部分,但在实际情况下,A 类有很多不同类型的字段,而 B 类中的所有字段总是 type Boolean。理想情况下,我不必为 A 类中使用的每个不同字段类型添加泛型

编辑 2:有关手头用例的更多详细信息:

我需要将一个Full对象转换为Partial一个基于一些的对象Configuration(配置的字段false最终应该nullPartial对象中)。这三个类非常相似,这就是为什么我想对它们强制执行合同(这样它们就不会随着时间的推移而失去同步)。

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,
        ...
)
4

1 回答 1

1

这不是编译时检查,但您始终可以编写一个强制执行此约束的测试。

例如,我编写了一个测试,找到所有用我的 DSL 注释修饰的函数,并验证所有这些函数都在我们的文档中进行了描述(是的!测试文档!)。

您可以使用反射库,这使得使用反射更有趣(kotlin-reflect 已经很好,但仍然......)。

于 2020-06-19T16:04:30.640 回答