2010-09-21 3 views
1

Как сравнить объект базового класса с производным классом в производном классе? Мне нужно, чтобы получить true в качестве выхода из кода ниже:Как сравнить объект производного класса с базовым классом java?

class Base { 
    int i; 
    String str; 
} 

class Derived extends Base{ 
    double d; 
    String str1; 

    public static void main(String []a){ 
     Base b= new Base(); 
     Derived d = new Derived(); 
     System.out.println("Equals! :"+d.equals(b)); 
    } 
} 

Он всегда дает мне false как выход. Как сравнить базовый класс с производным классом?

ответ

1

Обычно для объектов одного и того же класса определено равенство объектов, например: вы можете захотеть, чтобы два объекта Base b1, b2 были равны, если их str и i значение равно, то вам нужно будет определить equals() (и, как правило, hashCode()) метод для проверки этого условия. Например:.

public boolean equals(Object obj) 
{ 
    // test for identity 
    if (this == obj) return true; 

    // check that obj is not null, and that it is an instance of Base 
    if (obj == null) return false; 
    if (getClass() != obj.getClass()) return false; 

    // compare attributes 
    Base other = (Base) obj; 
    if (i != other.i) return false; 
    if (str == null && other.str != null) return false; 
    if (!str.equals(other.str)) return false; 
    return true; 
} 

в вашем случае, поскольку Base и Derived разные классы , с различными атрибутами (Base имеет str и i, в то время как Derived имеет str, i, str1 и d), вам нужно будет точно определить, когда являются объектом Base и Derived объект должен быть одинаковым.

1

Ну, чтобы сделать это просто возвращает истину достаточно легко:

@Override 
public boolean equals(Object other) { 
    return true; 
} 

Однако, я бы утверждать, что это не то, что вы должны делать (даже в несколько менее тривиальной реализации).

Я думаю, что метод equals от Object не должен возвращать true, если типы на самом деле не совпадают. Иначе это заканчивается тем, что делает жизнь действительно сложной с точки зрения обеспечения того, чтобы аспекты симметрии, требуемые Object.equals(Object), выполнены. Он также не чувствует, что он выполняет natural равенство в этой точке.

Однако было бы вполне разумно написать класс, который может сравнивать любые два экземпляра Base для равенства в вашем конкретном случае. Хорошая вещь о компараторах равенства заключается в том, что они не должны быть такими же естественными - вы не определяете, какое равенство должно означать для всего типа - вы просто описываете одно конкретное сравнение.

К сожалению, Java не имеет интерфейса EqualityComparator<T> (или что-то еще), чтобы пойти с Comparator<T>. Это делает гораздо сложнее создавать (скажем) карты и наборы, которые используют конкретную идею равенства (и хэш-код для этого). Это может быть или не быть проблемой в вашем случае - как вы надеетесь использовать это сравнение равенства в любом случае? Если это в вашем собственном коде, вы можете написать свой собственный интерфейс EqualityComparator<T>. Если вы собираетесь построить карту или установить ее, это будет не так просто :(

Смежные вопросы