我想要register自定义格式化程序来处理Set<Integer>
。Play 2.0中使用泛型的自定义格式化器
最显而易见的方法:
Formatters.register(Set<Integer>.class, new AnnotationIntegerSetFormatter());
结果 “表达的非法的开始”。什么是正确的方式来做到这一点,或者这是不可能的?
我想要register自定义格式化程序来处理Set<Integer>
。Play 2.0中使用泛型的自定义格式化器
最显而易见的方法:
Formatters.register(Set<Integer>.class, new AnnotationIntegerSetFormatter());
结果 “表达的非法的开始”。什么是正确的方式来做到这一点,或者这是不可能的?
结束使用Formatters.register(Set.class, new AnnotationIntegerSetFormatter());
; parse
仍然可以返回Set<Integer>
和print
只投了Set
到Set<Integer>
:
public class AnnotationIntegerSetFormatter extends Formatters.AnnotationFormatter<IntegerSet,Set> {
@Override
public Set<Integer> parse(IntegerSet annotation, String text, Locale locale) {
Set<Integer> set = new TreeSet<Integer>();
for (String part : text.split(","))
set.add(Integer.parseInt(part));
return set;
}
@Override
public String print(IntegerSet annotation, Set value, Locale locale) {
List<Integer> sorted = new ArrayList<Integer>();
sorted.addAll((Set<Integer>) value);
Collections.sort(sorted);
return join(",", sorted.toArray());
}
private static String join(String separator, Object... values) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < values.length; i++) {
if (values[i] == null)
continue;
if (sb.length() > 0)
sb.append(separator);
sb.append(values[i].toString());
}
return sb.toString();
}
}
和完整性,注释我用:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IntegerSet {
int min() default Integer.MIN_VALUE;
int max() default Integer.MAX_VALUE;
}
由于这是基于注解,看来你可以注册多个格式化程序的Collection
类型,并通过注释区分它们。
Set<Integer>.class
不是合法的Java,因为该类型的通用组件在编译时被擦除。我认为使用Set.class
应该可以工作,尽管这会为所有Set<T>
类型注册您的处理程序。
您可能想用Java代替其中一个标签。 – 2012-07-07 02:40:36