我是泛型的新手。你可以看到我在知道 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;
}
}
}
最佳答案
您可以使用 Comparable
用于比较数字的接口(interface),因为所有数字基元的包装类都实现了它:
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>>
限制可以用作类型参数而不是 T 的类型。在这种情况下,它们需要实现 Comparable<T>
.
关于Java 泛型代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31638904/