gpt4 book ai didi

kotlin - 如何从枚举在 Kotlin 中创建编译时常量?

转载 作者:行者123 更新时间:2023-12-04 16:41:30 27 4
gpt4 key购买 nike

我有一个注释需要 defaultValue成为编译时常量。我拿defaultValue来自 enum以下:

enum class RaceType {
MARATHON,
SPRINT;

companion object {
fun apply(type: RaceType): RaceDto {
return when (type) {
MARATHON -> MarathonDto()
SPRINT -> SprintDto()
}
}
}
}

我的 dto s 如下:
interface RaceDto {
}

data class MarathonDto: RaceDto

data class SprintDto: RaceDto

当我使用注释时 @QraphQLArgument(defaultValue = RaceType.SPRINT.name) Kotlin 需要 RaceType.SPRINT.name成为编译时常量。

注释实现本身:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface GraphQLArgument {
String NONE = "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
String NULL = "\n\t\t\n\t\t\n\ue000\ue001\ue002\ue003\n\t\t\t\t\n";

String name();

String description() default "";

String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";

Class<? extends DefaultValueProvider> defaultValueProvider() default JsonDefaultValueProvider.class;
}

我看了 similar questions但没有看到如何解决的方法。我还找到了 article与该主题相关,但到目前为止没有任何效果。

旁注:我无法更改注释,因为它来自库,我也无法更改库。

总而言之,有没有办法从 enum 开始制作? Kotlin 中的编译时常量要在注释中使用吗?

最佳答案

is there a way to make from enum compile-time constant in Kotlin to use in an annotation?



不,因为正式 enum s aren't compile-time constants in Java .

但是请考虑 sealed类:

sealed class RaceType {
object MARATHON: RaceType() {
const val name = "MARATHON" // copy-paste is required here until https://youtrack.jetbrains.com/issue/KT-16304
}
object SPRINT: RaceType()

companion object {
fun apply(type: RaceType): RaceDto {
return when (type) { // the check is in compile time, because of sealed class
MARATHON -> MarathonDto()
SPRINT -> SprintDto()
}
}
}
}

仍然需要复制粘贴的一小部分。请在 kotlin compiler bug 上投票或 follow this thread .

但是,据我所知,这并不能解决您的问题 @QraphQLArgument(defaultValue = RaceType.SPRINT.name)不幸的是,因为类的名称与值不同。换句话说,对于密封类,您需要编写代码将输入字符串转换为它们。

关于kotlin - 如何从枚举在 Kotlin 中创建编译时常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59827126/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com