我从数据库中获得了一个对象类的实例(String,int,double或boolean)。我需要编写一种方法,可以使用二进制运算符(例如<=,!=,>等)将该对象与其他对象(String,int,double或boolean)进行比较。如果两个对象的类型相同,我将只运行此方法。我的方法看起来像
public boolean comparison(Object a, Object b, String operator) {
int result = a.compareTo(b);
String a2 = a.getClass().getName();
//followed by if/else if blocks to return true or false
//depending on operator and result
}
我设计了if / else if块,以确保不将二进制运算符用于不兼容的类型(例如> =用于String对象)。问题在于,由于对象类没有compareTo()方法,因此在尝试编译时出现“找不到符号错误”。如果这是python,则实际上不会有任何问题,因为我永远不会在没有compareTo()方法的比较函数中放入任何内容。但是,由于Java格式的原因,我被迫将输入声明为“对象”,因为我无法明确地说出在给定时刻必须比较的对象类型。
是否有某种方法可以覆盖Java的限制,并强迫它相信我,对象a将始终具有compareTo()方法?因为现在,看来我将不得不将对象转换为Strings,int,doubles或booleans,然后为每种数据类型编写4个不同的新比较函数。
答案 0 :(得分:1)
由于在java.lang.Comparable<T>
接口中声明了compareTo
方法,因此Bounded Type Parameters的使用可能会限制a
和b
参数,以便仅接受实现接口本身的对象。
您可以检查operator
参数以影响布尔结果。
如果需要,可以使用enum
值来避免字符串不匹配。
为简便起见,下面的代码未考虑null
的值。
enum Operator {
GREATER_OR_EQUALS,
LESS_OR_EQUALS
}
public <T extends Comparable<T>> boolean comparison(T a, T b, Operator operator) {
int test = a.compareTo(b);
switch(operator) {
case GREATER_OR_EQUALS:
return test >= 0;
default:
return test <= 0;
}
}
答案 1 :(得分:1)
Java的方法是首先使用instanceof
运算符,然后将其强制转换为适当的类:
if (a instanceof String && b instanceof String) {
String aAsString = (String) a;
int comparisonResult = a.compareTo(b);
compareTo()
如果a < b
给出负结果,0
给出a == b
,如果a > b
给出积极结果。因此,仅凭int结果可以告诉您足够的信息来决定您可能进行的比较操作的结果。数字类型int
/ Integer
,...具有相似的方法。
当然,只有在您的假设正确无误且对象确实是String
或Boolean
时,此方法才有效。并且请注意,boolean
和Boolean
是两种不同的类型!
答案 2 :(得分:-1)
最重要的答案总结了我想做的事情。我说的时候代码成功编译了
int result;
if (a instanceof Comparable && b instanceof Comparable) {
result = ((Comparable) a).compareTo((Comparable) b);
}
我还没有测试过,但是fantaghirocco的解决方案似乎也可以工作。