在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 类的实现,它动态地序列化作为用 @KeySerialized 注释的“文本映射键”传递的所有内容。签名如下
class MyMapKeySerializer<T> extends JsonSerializer<T> {
serialize (T keyToSerialize) {
// do magic
}
}
这是可行的,但我想限制 T 只接受用 @KeySerialized 注释的类,因为只有对于此类类,此方法才有意义。理想情况下,这将是这样的:
class MyMapKeySerializer<T annotatedWith @KeySerializable> extends JsonSerializer<T> {
serialize (T keyToSerialize) {
// do magic
}
}
哔哔one
守候你守候我
相关分类