【问题标题】:Generic type and own comparator通用类型和自己的比较器
【发布时间】:2017-05-06 07:26:08
【问题描述】:

我的优先级队列和比较器中的泛型类型有问题,因为我不知道如何重新输入。

当我调用 compare(IRecord t, IRecord t1)` 方法时,它需要 IRecord 对象,但我需要比较泛型类型。

类 AbstrPriorQueue 必须是泛型。

有一个与对象 IRecord 一起使用的比较器:

public class MyComparator implements Comparator<IZaznam> {

@Override
public int compare(IRecord t, IRecord t1) {
    if (t.getPriority() < t1.getPriority()) {
        return -1;
    } else if (t.getPriority() > t1.getPriority()) {
        return 1;
    } else {
        return 0;
    }
  } 
}

这是我缩短的修道院队列。我在构造函数中给出比较器。 IAbstrPriorQueue 只是接口。

public class AbstrPriorQueue<T> implements IAbstrPriorQueue<T> {
    // comparator
    private MyComparator myComparator;

    public AbstrPriorQueue(MyComparator myComparator) {
          this.myComparator = myComparator;
    }

    @Override
    public void insert(T data) {
          T temp = list.getLast();

          // there is a error (no suitable method found for compare(T,T))
          if (myComparator.compare(data, temp) <= 0) {
                // ....
          }
    }
}

你知道我能做什么吗?

【问题讨论】:

  • 你会先设置“全英文”代码(只是因为这有助于吸引更多观众)。

标签: java generics comparator


【解决方案1】:

您有一个误解:您不能对 unknown generic 类型的元素使用固定比较器!

您有一个适用于苹果的比较器;但是你想在一个可以接受各种东西的盒子里使用它。那个苹果比较器应该怎么知道如何比较香蕉?还是鸡蛋?

所以;一种可能的方法是将您的“盒子”更改为只接受苹果。

public class AbstrPriorQueue<T extends IZaznam> 

例如。

意思:你必须明确你的队列只接受 IZaznams 的东西。或者你不能使用那个特定的比较器。一种方式或另一种方式。你不能同时拥有它。

但最有可能的是,您希望反过来:通过使用也是通用的比较器:

public class AbstrPriorQueue<T> ... {
  private final Comparator<T> komparator;
  ...

你看,实际上没有需要在这个级别上修复比较器的类型!

现在你可以去:

AbstrPriorQueue<IZazname> izazies = new AbstrPriorQueuey<>(new Komparator());

【讨论】:

    猜你喜欢
    • 2011-01-31
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多