【问题标题】:Custom formatters with generics in Play 2.0Play 2.0 中具有泛型的自定义格式化程序
【发布时间】:2012-07-06 21:14:55
【问题描述】:

我想register 一个自定义格式化程序来处理Set<Integer>

显而易见的方式:

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

导致“非法的表达开始”。这样做的正确方法是什么,或者不可能?

【问题讨论】:

  • 您可能想用 Java 替换其中一个标签。

标签: java generics data-binding formatting playframework-2.0


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    最终使用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 类型注册多个格式化程序,并通过注释区分它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多