比较我班上两个泛型的更好选择。

时间:2017-10-16 21:10:09

标签: java class generics

我需要帮助的人。 有没有更好的版本来比较这个类“TreeBag”中的两个泛型?

我目前的解决方案是:

public class TreeBag<T> implements Bag<T>, Comparator<T> {
.
.
.
    @Override 
    public int compare(T o1, T o2) {
        int temp = Integer.parseInt(o1.toString()) - Integer.parseInt(o2.toString());
        if (temp < 0)
            return -1;
        else if (temp > 0)
            return 1;
        else
            return 0;
    }

这是我目前的解决方案。但我做的事情是一个非常难看的解决方案。 这个问题有更好的解决方案吗?

由于

2 个答案:

答案 0 :(得分:1)

您的TreeBag不应该 一个比较器,它应该 一个比较器:

 public class TreeBag<T> implements Bag<T> {
    private final Comparator<? super T> comparator;

    public TreeBag(Comparator<? super T> comparator) {
        this.comparator = Objects.requireNonNull(comparator, "comparator");
    }

    /// and somewhere 
   void somewhere() {
       T o1 = ....;
       T o2 = ....;

      int rc = comparator.compare(o1, o2);
      if (rc < 0) {
      } else if (rc > 0) {
      } else {
      }  
   }
}

例如,TreeBag<String>将使用new TreeBag<String>(String.CASE_INSENSITIVE_ORDER);创建。

然后会使用TreeBag<Integer>创建new TreeBag<Integer>(Comparator.naturalOrder());

答案 1 :(得分:0)

为了做正确的比较,比较者必须知道应该比较什么。

改善设计的几种方法:

  1. 使用<T extends Comparable>并使用o1.compareTo(o2)
  2. 使用<T extends YourDomainObject>并在YourDomainObject方法
  3. 中为compare编写特定逻辑
  4. TreeBag具体类方法中YourDomainObject抽象并为compare编写具体逻辑:MyTreeBag extends TreeBag<YourDomainObject> { ...
  5. 为TreeBag提供比较器
  6. 等等