gpt4 book ai didi

java - 在 Java 中强制将泛型接口(interface)作为注释的值

转载 作者:行者123 更新时间:2023-11-30 05:38:42 24 4
gpt4 key购买 nike

有没有办法在 Java 注释中接收泛型类型作为值?

// The generics interface:
public interface TypeConverter<S, R> {
public R convert(S sourceType);
}

// The implementation:
public DateConverter extends TypeConverter<String, Date> {
public String convert(Date sourceType) { ... }
}

// Applying the custom converter through an annotation on a field:
...
Converter(DateConverter.class);
public Date dateField;
...

// The issue! Receiving the generic type in an annotation value:
public @interface Converter {
//How to use the generic type as the type of "value"?
Class value() default void.class;
// versus
//Class<? extends TypeConverter> type() default void.class;
}

查看上面注释 Converter 上的注释。

最佳答案

没有办法做到这一点,但是,您可能会对一种解决方法感兴趣。

如果您不希望注释参数为必需且无法传递默认值,则始终可以使用数组。

public @interface Converter {
Class<? extends TypeConverter>[] type() default {};
}
//.. and the possible usages
@Converter
@Converter(type = FooConverter.class)
@Converter(type = { FooConverter.class, ThisIsWhatCanHappen.class }) // this is the downside of this approach

// retrieving type from annotation
void foo(Converter converter) {
TypeConverter typeConverter = converter.type().length > 0
? converter.type()[0]
: null; // or some default value
// now that you have your TypeConverter do a backflip or something
}

有两个缺点

  • 数组可以是任意长度,您无法控制它(这可能会令人困惑)
  • 使用起来稍微不太舒服,您必须检查数组是否不为空并获取它的第一个元素才能访问 type 值。

关于java - 在 Java 中强制将泛型接口(interface)作为注释的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56137742/

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