如何超越Java对对象的限制

时间:2019-03-01 16:46:21

标签: java object

我从数据库中获得了一个对象类的实例(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个不同的新比较函数。

3 个答案:

答案 0 :(得分:1)

由于在java.lang.Comparable<T>接口中声明了compareTo方法,因此Bounded Type Parameters的使用可能会限制ab参数,以便仅接受实现接口本身的对象。
您可以检查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,...具有相似的方法。

当然,只有在您的假设正确无误且对象确实是StringBoolean时,此方法才有效。并且请注意,booleanBoolean是两种不同的类型!

答案 2 :(得分:-1)

Casting variables in Java

最重要的答案总结了我想做的事情。我说的时候代码成功编译了

int result;
if (a instanceof Comparable && b instanceof Comparable) {
   result = ((Comparable) a).compareTo((Comparable) b);
}

我还没有测试过,但是fantaghirocco的解决方案似乎也可以工作。