2010-07-28 44 views
1

在我的理解中,即使我通過父指針調用它,下面的等號和哈希碼的實現是安全的,因爲派生類中的正確方法將調用(而不是父類)。只要父級被視爲抽象類(用於JPA - hiberante基類)。請根據下面的例子確認這個假設。繼承類中的等號和哈希碼

@Entity 
@Inheritance 
class A { 
String type; 
} 

@Entity 
class B extends A { 
String uniqueName; 
....... 

@Override 
    public boolean equals(Object obj) { 
.. 
} 
@Override 
    public int hashCode() { 
} 
} 

@Entity 
class C extends A { 
String uniqueName; 
....... 
@Override 
    public boolean equals(Object obj) { 
.. 
} 
@Override 
    public int hashCode() { 
} 
} 

class D { 
A a; 
String name; 
} 

由於A可以接受B和C的情況下,寫入等於/散列法對d時,是它確定與上述實施(僅在乙& C,不是在A)。不會有A直接實例化(新的A)的情況。

謝謝。

+0

哪些實現?你只是發佈了聲明,而不是方法體。 – 2010-07-28 18:24:17

+1

使用IDE生成的代碼。 – bsr 2010-07-28 18:36:51

回答

0

我認爲你的示例代碼不完整,因爲我懷疑你問的是如果d.equals()方法使用a.equals(),那麼equals()方法的哪個版本被調用?

如果這就是你要求的,那麼答案將是a類型的equals()方法。如果aB,則將調用B.equals()。如果aC,則調用C.equals()。無論A是否自己實現equals()方法,這都是如此。

既然你提到Hibernate,我想你正在嘗試創建一個聯合子類映射或一些這樣的。如果你正確映射它,那麼Hibernate將不會嘗試直接實例化一個A,無論如何這應該是抽象的,因爲這就是你描述它的方式。

+0

謝謝..抱歉不清楚我的問題,但你猜對了我: - ) – bsr 2010-07-29 12:42:58

2

你問是否可以在直接超類沒有實現它們的派生類中編寫hashcode和equals方法?

如果你說類A永遠不會被直接實例化,爲什麼不聲明一個抽象,那麼就沒有問題了。

+0

湯姆,謝謝..是的,這是我的問題..不是關於執行... 我不知道JPA如何處理抽象類..快速搜索顯示一些指定DiscriminatorColumn的例子..我會讀更多。 – bsr 2010-07-28 19:18:12

+0

@bsreekanth,當你沒有專門重寫equals中的equals時,equals()和hashCode()就是從Object繼承而來的。 – aberrant80 2010-07-29 05:50:10

1

在我的理解,下面 實施的平等和hashCode 是安全的,因爲在 派生類中正確的方法將調用(而不是 父),即使我把它通過 父指針。

你在問多態嗎?如果你這樣做:是的,調用哪個方法取決於運行時類型,而不是引用的類型。只要你的對象是B或C類型,一切都很好。