Java类定义中的重载类型参数

时间:2013-09-25 21:14:56

标签: java generics types overloading

假设我有一个java类

public class Foo<ELEMENT, COMPARATOR extends Comparator<ELEMENT>> {
    public Foo(ELEMENT e, COMPARATOR c) {...}
}

如何重新加载类型参数<ELEMENT>,以便我也可以使用

public class Foo<ELEMENT extends Comparable> {
    public Foo(ELEMENT e) {
       this(e, new Comparator<ELEMENT>() {
           public int compare(ELEMENT e1, ELEMENT e2) {
              return e1.compareTo(e2);
           }
       })
    }
}

1 个答案:

答案 0 :(得分:3)

基本上,你不能。 (TreeSet是一个可以执行此操作的类的示例。)

另一方面,您可以做的一件事是使用静态工厂方法而不是公共构造函数。例如,您可以写

public class Foo<E> {
  public static <E> Foo<E> withComparator(E e, Comparator<? super E> comparator){
    ...
  }
  public static <E extends Comparable> Foo<E> withoutComparator(E e) {
    ...
  }
}

这允许您对不同的工厂方法设置不同的类型约束,例如:在不带Comparable的重载上添加Comparator约束。