我正在尝试创建一个只接受两种类型的泛型类(即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上定义,...),我无法弄明白为什么,因此我需要你的帮助。
提前致谢
答案 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
派生的类型(这意味着您不能再使用>
,因为它仅适用于基元)或者您不能使用泛型。
一种解决方案是不使用int
。 double
是64位,可以包含int
可以拥有的任何值。此外,由于int
从不进行分数转换,因此双倍不会导致精度损失或舍入错误。
所以你可以编写一个包含IntFreq
的类Freq
并相应地转换所有值。
答案 3 :(得分:0)
尝试使用this.frequency.doubleValue()进行比较。