2013-08-19 20 views
1

可以在java中強制上鑄類型?看例子。強制Java上鑄類

public class Animal{} 

public class Dog extends Animal{} 

Dog dog = new Dog(); 
Animal test = dog; 

我有什麼:(test instanceof Dog)(test instanceof Animal)返回True。
我想要什麼:(test instanceof Dog) ==虛假和(test instanceof Animal) ==真

有辦法迫使測試是唯一一種動物?或者唯一的辦法是創建一個動物通過狗的構造函數?我試圖避免創建一個構造函數,因爲我有一個複雜的對象,有很多getters/setter。

謝謝。

+5

底層對象**是**狗''。沒有任何鑄件可以改變這一點。如果你想要一個**只是**的對象,你需要以某種方式創建一個新的動物。 –

+4

如果你的設計依賴於它,它可能會被破壞。向我們展示一個實際的用例,而不是一個希望獲得不存在的語言功能的學術問題。 – millimoose

+0

我認爲@OliCharlesworth明白了。看起來像是不可能做到我想要的而不創建Animal的新實例。請回答這個問題,我可以給你正確的答案。 – afzimmermann

回答

1

當你「延伸」,你說狗一個動物。我看到你編碼的行爲是正確的。

如果had-

class Animal {} 
class Human {} 

class Cat extends Animal{} 
class Child extends Human {} 

貓是動物。

孩子是一個人。

貓不是人類。

孩子不是動物。

+0

但人類也是動物:) – ZhongYu

+0

@ zhong.j.yu當我寫信時,我知道有人會這麼說。 :) –

1

測試狗的一個實例,並且測試是動物的一個實例。

這不是一個問題,它是面向對象編程的一個好方法。多態性。

無論你確定類型的原因是什麼類型的確切類型動物可能是由於糟糕的設計。

2
if (test.getClass() == Animal.class) {... 
7

我不知道你爲什麼會關心,如果對象是一個Animal但不是Dog,畢竟DogAnimal。任何可以應用於Dog的應用都適用於Animal,否則會出現設計問題。

但如果你必須確定,然後調用getClass()(由Object定義)來獲得Class對象,然後將其與Animal.class比較。

if (Animal.class == test.getClass()) 
+0

問題是我試圖堅持這個對象與休眠。當我嘗試堅持「狗」時,我得到了「java.lang.IllegalArgumentException:Unknown entity」。如果我堅持動物,我很好。這就是爲什麼我不想「測試」成爲動物。 – afzimmermann

+0

假設測試必須特別是動物。如果重點是檢查'test'不是'Dog',而是任何其他種類'Animal',那麼我想恢復其中一個原始檢查就足夠了:'!(test instanceof Dog)和(test instanceof Animal) '。不應該嗎? –

+0

您應該使用'equals'方法來代替2個類由不同的類加載器加載。 –

0

沒有辦法改變實例的類型。你可以使用它的實例,就好像它是一個動物的實例。

此外,許多setter和getters不應該太多的問題,它不應該需要輸入的狗。只需要有一個構造函數直接複製Animal中的所有字段(您可以直接使用同一類的其他對象訪問字段),並且可以接受狗作爲參數。

public class Animal{ 
    private int[] data; 
    public Animal(Animal a){ 
     data=a.data; 
     ... 
    } 
}