Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Play 2.0中使用泛型的自定义格式化程序_Java_Generics_Data Binding_Formatting_Playframework 2.0 - Fatal编程技术网

Java 在Play 2.0中使用泛型的自定义格式化程序

Java 在Play 2.0中使用泛型的自定义格式化程序,java,generics,data-binding,formatting,playframework-2.0,Java,Generics,Data Binding,Formatting,Playframework 2.0,我想要一个用于处理集的自定义格式化程序 显而易见的方式是: Formatters.register(Set.class,new AnnotationIntegerSetFormatter()) 导致“表达式的非法开始”。这样做的正确方法是什么,还是不可能?Set.class不是合法的Java,因为该类型的泛型组件在编译时被擦除。我认为使用Set.class应该可以,尽管这将为所有Set类型注册处理程序。最终使用了Formatters.register(Set.class,new Annotati

我想要一个用于处理
集的自定义格式化程序

显而易见的方式是:

Formatters.register(Set.class,new AnnotationIntegerSetFormatter())


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

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

最终使用了
Formatters.register(Set.class,new AnnotationIntegerSetFormatter())
parse
仍然可以返回
Set
,在
print
中,只需将
Set
转换为
Set


由于这是基于注释的,因此您似乎可以为
集合注册多个格式化程序
类型,并通过注释区分它们。

您可能希望用Java替换其中一个标记。
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;
}