有限的通用类型

时间:2011-03-29 15:20:01

标签: java

我正在尝试创建一个只接受两种类型的泛型类(即Integers和Doubles),好像我只使用Double类型创建类,当我使用相同的类时,我会浪费空间对象只有int字段。

以下是代码:

public class Freq implements Comparable {
private String term;
public double frequency;

public String getTerm() {
    return term;
}

public void setTerm(String term) {
    this.term = term;
}

public Freq( String term, int frequency ) {
this.term = term;
this.frequency = frequency;
}

public int compareTo(Object arg) {
    if(this.frequency == ((Freq)arg).frequency)
        return 0;
    else if( this.frequency  >  ((Freq)arg).frequency ) {
        return 1;
    }
    else 
        return -1;
}

现在你可以看到这个类的成员频率为double,但我想 留下那个通用但仅限于双打和整数。但是,如果我添加诸如<T extends Number>之类的泛型类型,那么compareTo方法失败(它表示运算符&gt;未在Numbers或T上定义,...),我无法弄明白为什么,因此我需要你的帮助。

提前致谢

4 个答案:

答案 0 :(得分:3)

您可以使用以下内容使其完全通用:

public class Freq<N extends Number & Comparable<N>> implements Comparable<Freq<N>> {

  private final N frequency;

  public Freq(N frequency) {
    if (frequency == null) {
      throw new IllegalArgumentException("frequency must be non-null");
    }
    this.frequency = frequency;
  }

  public int compareTo(Freq<N> other) {
    return frequency.compareTo(other.frequency);
  }
}

如果对象大小是您主要关注的问题,那么这可能不是最佳解决方案,因为您需要存储对包装器对象的引用(Double或{{1}除了对象本身之外,它几乎肯定比仅存储Integer本身更大。

因此,实现仅提供double值的简单Frequency类可能实际上有助于安全空间。

答案 1 :(得分:1)

您不能将原语用于泛型类型。但是你可以将任何int值存储在double中,所以我只想使用double来表示所有内容。

顺便说一句:你可能会发现这个更简单

public class Freq implements Comparable<Freq>
  public int compareTo(Freq freq) {
    return Double.compare(frequency, freq.frequency);
  }

答案 2 :(得分:0)

泛型不与原始类型混合。因此,您必须使用从Number派生的类型(这意味着您不能再使用>,因为它仅适用于基元)或者您不能使用泛型。

一种解决方案是不使用intdouble是64位,可以包含int可以拥有的任何值。此外,由于int从不进行分数转换,因此双倍不会导致精度损失或舍入错误。

所以你可以编写一个包含IntFreq的类Freq并相应地转换所有值。

答案 3 :(得分:0)

尝试使用this.frequency.doubleValue()进行比较。