2012-07-06 43 views
3

我想要register自定义格式化程序来处理Set<Integer>Play 2.0中使用泛型的自定义格式化器

最显而易见的方法:

Formatters.register(Set<Integer>.class, new AnnotationIntegerSetFormatter());

结果 “表达的非法的开始”。什么是正确的方式来做到这一点,或者这是不可能的?

+0

您可能想用Java代替其中一个标签。 – 2012-07-07 02:40:36

回答

2

结束使用Formatters.register(Set.class, new AnnotationIntegerSetFormatter());; parse仍然可以返回Set<Integer>print只投了SetSet<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类型,并通过注释区分它们。

3

Set<Integer>.class不是合法的Java,因为该类型的通用组件在编译时被擦除。我认为使用Set.class应该可以工作,尽管这会为所有Set<T>类型注册您的处理程序。