java - Java 泛型类型绑定到具有特定注释的类
问题描述
在 java 中,可以将泛型参数绑定到实现特定接口的类,因此可以进行以下操作
interface MyInterface {}
class MyClassA implements MyInterface {}
class MyBoundedClassA<T extends MyInterface>
现在,如果我想将接口绑定到使用特定注释注释的类,例如:
interface @MyAnnotation {}
@MyAnnotation
class MyClassB {}
class MyBoundedClassB<T extends MyAnnotation> // NOT possible
是否有可能在 Java 中实现这样的行为?
- - 编辑
根据要求添加真实世界的示例。稍微修改域以使示例更易于理解。
有众所周知的用于序列化对象的杰克逊库。此库不支持字符串以外的映射键的序列化,因此无法开箱即用以下操作
class TimeRange {
LocalDateTime startDate;
LocalDateTime endDate;
}
class SportsmenActivities {
private Map<String, <TimeRange, List<Activity>> sportActivities;
}
在此示例中,外部地图的键是“sportsmanCode”,例如“andy”、“mike”、“john”。内部地图包含给定运动员在给定时间段内执行的活动。
因此,假设安迪慢跑了一天,而不是条目:
new SportsmanActivities().get("andy").put(TimeRange.of('2012-12-01,'2012-12-02'), List.with(new JoggingActivity)) // did some pseudo code here for readablity
现在正如所说的杰克逊不会开箱即用地序列化它,所以我编写了通用模块,它允许序列化这种复杂的地图。
要使用它,您需要做的是像这样注释您的“关键”类:
@KeySerializable
class TimeRange {
@MyMapKey
LocalDateTime startDate;
@MyMapKey
LocalDateTime endDate;
}
正如您所猜测的那样,带有@MyMapKey 注释的字段将用于生成 MapKey。
现在我有一个 jackson 类的实现,它动态序列化作为用@KeySerializable 注释的“文本映射键”传递的所有内容。签名如下
class MyMapKeySerializer<T> extends JsonSerializer<T> {
serialize (T keyToSerialize) {
// do magic
}
}
这可行,但我想将 T 限制为仅接受使用 @KeySerializable 注释的类,因为仅对于此类类,此方法才有意义。理想情况下,这将是这样的:
class MyMapKeySerializer<T annotatedWith @KeySerializable> extends JsonSerializer<T> {
serialize (T keyToSerialize) {
// do magic
}
}
解决方案
如果您的目标是断言只接受带注释的类,那么您几乎没有解决方法:
- 编写一个在编译时执行断言的注释处理器(查看 @NonNull 等如何工作)。这是一项有趣的工作,但并非微不足道,因为编译/类型系统对于许多经验丰富的 Java 开发人员来说是全新的。
- 使用某种形式的 AOP(AspectJ、Spring AOP 等)来“建议”所有带有装饰器的带注释的方法,装饰器的职责是断言参数具有相同的注释。
- 在运行时使用显式检查
parameter.getClass().isAnnotationPresent(MyAnnotation.class)
推荐阅读
- c++ - gcc linux x86-64 C++中的有效指针是什么?
- inheritance - Dart类继承:如何将父类的所有属性分配给子子
- c - 我如何在我的函数下面调用一个函数
- c# - 一个或多个实体的 C# MVC 验证失败
- kubernetes - kubeadm dind 不会从 http 上的不安全注册表中提取
- spring-boot - Spring Boot 看不到小胡子模板
- python - 更改类中使用的变量?
- android - 循环 AnimationSet 会导致 StackOverflowError
- c++ - Visual Studio 找不到任何 CRT 文件(如 assert.h)?
- python - 为午夜后的时间戳重新排序 x 轴 - Matplotlib