2014-03-27 28 views
1

我有類Animal和兩個小類TigerEagle。兩個子類都有hunt這個方法幾乎是一樣的。他們唯一的區別是受害人的類型。尋找方法是使用泛型類Field<T>來尋找受害者。它看起來像這樣:作爲列表的類型的類對象

void hunt(){ 
    Field<Cattle> field = new Field<Cattle>(); 
    List<Cattle> list = field.getObjects(); 
    ... 

void hunt(){ 
    Field<Rabbit> field = new Field<Rabbit>(); 
    List<Rabbit> list = field.getObjects(); 
    ... 

有什麼辦法來執行類似的東西?

void hunt(Object type){ 
    Field<type> field = new Field<type>(); 
    List<type> list = field.getObjects(); 

我知道,我可以得到表滿Object類型和使用instanceof後,但在這裏我們來的第二個問題:

是否可以調用if(object instanceof instanceOfSomeClass)

+0

所以你想把'hunt()'方法移到超類? –

+0

是的。我忘了提及這一點。 – nervosol

+0

我想這是不可能的。一種選擇是使用泛型方法,但由於該方法既沒有任何參數,也沒有任何返回類型,因此不會推斷出類型參數。只有在子類中使用該方法會更有意義,因爲它們實際上是針對不同的數據進行操作的。 –

回答

2

可以使用泛型來實現你想要的:

public class AnimalsGenerics<E> { 
    public void Hunt(E prey){ 
     ... 
    } 
} 

並實現你的動物指定獵物:

public class Tiger extends AnimalsGenerics<Buffalo> { 
} 

但我個人的執行將使用的接口來指定哪些呢動物例如:如果動物不是獵人,例如草食動物,你會需要再次實施動物課程會發生什麼?跟着離開執行的接口,而不是傳承會幫助你有一個更乾淨的代碼的原則,我dessign是:

要設計的行爲:

public interface CollectFoodBehaviour<E> { 
    void collectFood(E prey); 
} 

類動物是:

public class Animal<E> { 

    CollectFoodBehaviour<E> collectFoodBehaviour; 

    public void goToGetFood(E food){ 
     collectFoodBehaviour.collectFood(food); 
    } 
} 

實施捕獵行爲:

public class HuntAnimalsBehaviour<E> implements CollectFoodBehaviour<E> { 
     @Override 
     public void collectFood(E prey) { 
      //implemenet the generic hunting process 
     } 
    } 

和一個動物實例爲例:

public class Dog extends Animal<Rabbit> { 

    public Dog(){ 
     this.collectFoodBehaviour = new HuntAnimalsBehaviour<Rabbit>(); 
    } 
} 
1

是否可以調用if(object instanceof instanceOfSomeClass)?

否,的instanceof測試如果對象是類的一個實例,不是一個實例的實例(彷彿左側是一個非靜態參考和右側是靜態的參考);但是,您可以不聲明您的實例

// JButton b = new JButton(); 
// if (b instanceof Component) can be replced with 
if (JButton.class.newInstance() instanceof Component) 
// or 
if (new JButton() instanceof Component) 

如果出於某種奇怪的原因,您覺得這很有用。

1

如果我理解正確的話,你可以使用一個通用的方法使用下面的代碼:如果你通過了對象類

,而不是例如,你可以使用Class作爲參數傳遞構造Field實例。

public class MyAnimal { 
    public <T> void hunt(Class<T> type) { 
     Field<T> field = new Field<>(); 
     List<T> list = field.getObjects(); 

     if (type == Cattle.class) { 
      System.out.println("Type is a Cattle"); 
     } else { 
      System.out.println("Type is not a Cattle, is a " + type.getName()); 
     } 
    } 

    public static void main(String[] args) { 
     new MyAnimal().hunt(Cattle.class); 
     new MyAnimal().hunt(new Cattle().getClass()); 
    } 
} 

關於你的第二個問題,如果你有類類型,你可以問一個簡單的:type == MyClass.class

相關問題