2016-09-17 73 views
0

我無法將接口添加到groovy枚舉。添加接口到groovy枚舉?

例如:

接口DeviceType.groovy

public interface DeviceType{ 
    public String getDevice() 
} 

枚舉Device.groovy

public enum Devices implements DeviceType { 

    PHONE{ 
     public String getDevice(){ 
      return "PHONE" 
     } 
    }, ALARM { 
     public String getDevice(){ 
      return "ALARM" 
     } 
    } 
} 

簡單測試

public class MainTest(){ 

    public static void main(String [] args) { 
    System.out.println(Devices.PHONE.getDevice()); 
    //should print phone 
    } 
} 

這是僞代碼,而是一個相當不錯的例。 當我將它與Groovy一起使用時,我從IntelliJ中得到一個錯誤,我需要使該接口變爲抽象。 如果我把它抽象化,maven不會編譯它說它不能既是靜態的也是最終的。

任何提示?

+0

注意:Devices.PHONE.getDevice(); – Will

+0

這肯定會在mvn測試中破解。 – Will

+0

錯誤:(23,1)Groovyc:在非抽象類中不能有抽象方法。類'xxx'必須聲明爲抽象或者必須實現方法'getDevice()'。 – Will

回答

2

您需要在enum中定義getDevice()。由於枚舉是一個類,你的類實現接口,它需要實現的功能

枚舉Device.groovy

public enum Devices implements DeviceType { 

    PHONE{ 
     public String getDevice(){ 
      return "PHONE" 
     } 
    }, ALARM { 
     public String getDevice(){ 
      return "ALARM" 
     } 
    }; 

    public String getDevice(){ 
     throw new UnsupportedOperationException(); 
    } 

} 
1

:然後你就可以覆蓋它,像這樣。現在你所擁有的是一個不實現該函數的枚舉,其實例是每個具有相同名稱的函數的子類。但由於枚舉本身沒有它,這還不夠好。

我想提供我的首選語法的情況下,如本:

public enum Devices implements DeviceType { 
    PHONE("PHONE"), ALARM("ALARM") 
    private final String devName 
    public String getDevice() { return devName } 
    private Devices(devName) { this.devName = devName } 
} 

或者,如果「設備」總是會匹配枚舉實例的名稱,你還不如只需返回:

public enum Devices implements DeviceType { 
    PHONE, ALARM 
    public String getDevice() { return name() } 
}