2016-09-17 2 views
0

groovy enum에 인터페이스를 추가 할 수 없습니다.groovy enums에 인터페이스를 추가 하시겠습니까?

예 :

인터페이스 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 테스트로 maven에서 중단됩니다. – Will

+0

오류 : (23, 1) Groovyc : 비 추상적 클래스에서 추상 메서드를 사용할 수 없습니다. 'xxx'클래스는 abstract로 선언되거나 '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

을 열거 클래스이며, 클래스가 인터페이스를 구현하고,이 기능을 구현해야하기 때문에. 지금 가지고있는 것은 열거 형입니다.이 열거 형은 함수를 구현하지 않습니다. 인스턴스는 같은 이름의 함수를 가진 각 하위 클래스입니다. 그러나 enum 자체에는 그것을 가지고 있지 않기 때문에 충분하지 않습니다.

나는 이와 같은 상황에 대한 나의 선호하는 구문을 제공하고 싶습니다 :

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() } 
} 
관련 문제