我是仿制药的新手。在了解val
,filterSmall
,filterGreat
的确切类型后,您可以看到我重复了一些代码。我想编写用于将val
与过滤器值进行比较的通用代码。我可以写这样的东西
private <T> boolean compareAgainstFilters(T val, T filterSmall, T filterGreat) {
if (!(filterSmall != null && filterSmall <= val)) {
return true;
}
if (!(filterGreat != null && val <= filterGreat)) {
return true;
}
return true;
}
但是在编译时,java不知道<=
运算符是否对类型T
有效。
我不想重复代码,那么我该如何实现呢?
if (value != null) {
switch (value.getClass().getName()) {
case "java.lang.Long":
Long filterSmall = (Long) filterSmaller;
Long filterGreat = (Long) filterGreater;
Long val = (Long) value;
if (!(filterSmall != null && filterSmall <= val)) {
return true;
}
if (!(filterGreat != null && val <= filterGreat)) {
return true;
}
break;
case "java.lang.Float":
Float filterSmallFloat = (Float) filterSmaller;
Float filterGreatFloat = (Float) filterGreater;
Float valFloat = (Float) value;
if (!(filterSmallFloat != null && filterSmallFloat <= valFloat)) {
return true;
}
if (!(filterGreatFloat != null && valFloat <= filterGreatFloat)) {
return true;
}
}
}
答案 0 :(得分:24)
您可以使用 private <T extends Comparable<T>> boolean compareAgainstFilters(T val, T filterSmall, T filterGreat) {
if (!(filterSmall != null && filterSmall.compareTo(val)<=0)) {
return true;
}
if (!(filterGreat != null && val.compareTo(filterGreat)<=0)) {
return true;
}
return true;
}
接口来比较数字,因为所有数字基元的包装类都实现了它:
<T extends Comparable<T>>
Comparable<T>
限制可用作类型参数而不是T的类型。在这种情况下,他们需要实现build and reload
。
答案 1 :(得分:4)
您无法在通用方法中使用<
或>
运算符。通常,当变量的类型为Float
或Long
时,编译器会在编译代码中进行自动拆箱转换(获取基元类型)后接受运算符。换句话说,
filterSmall <= val
编译为:
filterSmall.longValue() <= val.longValue()
在泛型方法中,编译器无法应用拆箱转换。执行比较的唯一方法是让type参数扩展Comparable
接口,并使用compareTo
方法。请注意,Float
,Long
等类型已经实现了此接口。