2015-04-22 75 views
0

這裏是一些使用get()方法的枚舉。Java。在枚舉中使用泛型獲取特定類型

public class ZooTest { 

    public enum Animals { 

     CHLOE("cat"), 
     MOLLY("dog"), 
     LUNA("cat"), 
     TOBY("dog"), 
     ZOE("parrot"), 
     SNICKERS("cat"); 

     private final String type; 

     Animals(String type) { 
      this.type = type; 
     } 

     public class Animal { 
     } 

     public class Cat extends Animal { 
     } 

     public class Dog extends Animal { 
     } 

     public class Parrot extends Animal { 
     } 

     public Animal get() { 
      return "cat".equals(type) 
        ? new Cat() 
        : "dog".equals(type) 
          ? new Dog() 
          : new Parrot(); 
     } 
    } 

    @Test 
    public void shouldReturnSpecificClass() { 
     assertTrue(Animals.CHLOE.get() instanceof Cat); 
    } 

    @Test(expectedExceptions = {ClassCastException.class}) 
    public void shouldReturnSpecificClass2() { 
     Dog dog = (Dog) Animals.CHLOE.get(); 
    } 
} 

問題是,如何改進以返回特定類型的動物而不使用外部枚舉類型投射。當然,我可以使用如下方法:

public <T extends Animal> T get(Class<T> clazz) { return (T) get(); } 

但也許有一些笨拙的方法。

+2

這看起來像一個枚舉是不適合的。也許更好的做法是將每個動物作爲一個實例,在「動物」類中註明枚舉類型?枚舉用於不改變的值,這是一種不直觀地應用於動物列表的屬性。 – Sinkingpoint

+0

並擺脫字符串常量。在這裏,似乎你可以使用類對象(比如'Cat.class')。 – Thilo

+2

問題:您打算如何使用此設計來實現? – GhostCat

回答

2

此答案基於假設您實際上不需要單獨使用Cat作爲CHLOE,LUNA或SNICKERS的實例。另外,由於你的動物沒有任何方法或狀態,它看起來並不像你真的需要它們作爲單獨的類。所以也許這樣會更容易:

public enum AnimalType { 
    Cat, Dog, Parrot; 
} 

public enum Animals { 

    CHLOE(AnimalType.Cat), 
    MOLLY(AnimalType.Dog), 
    LUNA(AnimalType.Cat), 
    TOBY(AnimalType.Dog), 
    ZOE(AnimalType.Parrot), 
    SNICKERS(AnimalType.Cat); 

    private final AnimalType type; 

    Animals(AnimalType type) { 
     this.type = type; 
    } 

    public AnimalType get() { 
     return type; 
    } 
} 
2

您可以創建一個抽象方法get動物是每個實例必須實現:

public enum Animals { 

     CHLOE("cat") { 
      @Override 
      public Animal get() { return new Cat(); } 
     }, 
     MOLLY("dog") { 
      @Override 
      public Animal get() { return new Dog(); } 
     } 
     //... and so on 

     public abstract Animal get(); 
    } 
+0

不幸的是,即使'CHLOE(「貓」){公貓Cat get(){return new Cat(); }}'不會允許'Cat cat = Animals.CHLOE.get();' – ytterrr

+0

爲什麼不呢?哪個是錯誤? –

+0

我的錯誤是「不兼容的類型:Animals.Animal不能轉換爲Animals.Cat」。 – ytterrr

0

你必須使用枚舉的兩個錯誤。第一個枚舉實體必須提供類型不是實例的東西(如何指向Quirliom),然後您的動物枚舉必須包含成員貓,狗等。第二個遺憾的是,您不能從枚舉擴展任何類。