【问题标题】:Overload type parameter in Java class definitionJava 类定义中的重载类型参数
【发布时间】:2013-09-25 21:14:56
【问题描述】:

假设我有一个 java 类

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

如何重新加载类型参数&lt;ELEMENT&gt; 以便我也可以拥有类似的东西

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);
           }
       })
    }
}

【问题讨论】:

    标签: java generics types overloading


    【解决方案1】:

    你不能,基本上。 (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) {
        ...
      }
    }
    

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

    【讨论】:

    • 谢谢,有道理。
    • 在您的解决方案中,类型参数COMPARATOR 已从类定义中删除,如果我想保留该参数怎么办?
    • 你能解释一下你在做什么,比较器应该是一个类型而不是一个对象吗?这对于比较器通常没有意义。
    • 嗯,我想创建一个通用的 Range 概念,它有一个边界(to,from),一个比较器来确定范围内元素的顺序,以及一个 Step 计算器确定如何在其中移动元素。一个范围可以与另一个相同类型的范围合并(相同的元素类型、相同的比较器类型和相同的步长计算器类型)。因此需要将比较器类型添加到类类型参数中。我已经定义了通用范围并且效果很好,但是我想创建一个只有元素类型参数和比较器类型的简单范围,步骤计算器类型应该默认为某事
    • 顺便说一句,比较器是 Range 被定义为泛型函数:interface Func2&lt;P1, P2, R&gt; {R apply(P1 p1, P2 p2);}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 2022-01-26
    • 2021-05-17
    • 1970-01-01
    相关资源
    最近更新 更多