2009-05-31 5 views
2

내가 자바 Date 객체에서 현재 유닉스 타임 스탬프를 얻을 수있는 좋은 방법을 원이 내 솔루션입니다 내 사용자 지정 날짜 클래스 자바 Date 객체, 즉 :자바 타입 캐스팅 및 상속

Calendar foo = Calendar.getInstance(); 
foo.set(0, 0, 0, 12, 30); 
myapp.Date foo2 = (myapp.Date)foo.getTime(); 

이 생성 : 스레드에서 예외 "주요"java.lang.ClassCastException가 : java.util.Date가 myapp.Date 캐스팅 할 수없는

I 이해하다 왜이 예외가 만들어졌지만 수퍼 클래스를 서브 클래스로 형 변환 할 수있는 방법이 있습니까? 그렇지 않다면 어떻게 unixtimestamp 메소드를 구현하겠습니까? 제 신청서에 꽤 자주 사용합니다.

답변

3

하위 클래스가 수퍼 클래스보다 더 큰 인터페이스를 가질 수 있으므로 하위 클래스에 수퍼 클래스를 캐스팅 할 수 없습니다. 수퍼 클래스에없는 getUnixTimeStamp()와 같은 기능을 하위 클래스가 가질 수 있음을 의미합니다. 위의 예에서 java.util.Date에서 getUnixTimeStamp를 호출하려고한다는 것을 의미합니다.

상속 대신 위임이나 작곡을 사용할 수 있습니다. 의미

당신은 당신이 java.util.date arround에 클래스를 생성 당신이 당신의 날짜로 날짜를 캐스팅하지 않습니다 이런 식으로 클래스

public class Date { 

    private java.util.date date; 

    public Date(java.util.Date date) { 
     this.date = date 
    } 

    public int getUnixTimeStamp() { 
     int unixtimestamp = (int) ((this.date.getTime()) * .001); 
     return unixtimestamp; 
    } 

}

있습니다.

이 함수 만 사용하는 경우 변경된 날짜를 반환하는 정적 유틸리티 함수 getUnixTime (날짜 날짜)을 만드는 것이 더 쉬운 솔루션 일 수 있습니다.

0

왜이 클래스를 java.util.Date로 확장해야합니까? Date를 취하고 해당 날짜의 유닉스 타임 스탬프를 반환하는 정적 함수를 만듭니다.

당신이 당신의 서브 클래스를 가진 예리한 경우
2

하는 java.util.Date foo을 복용하여 Date 클래스의 생성자를 구현하고 거기에 foo.getTime()super 전화; 캐스팅하는 대신 Date(foo)을 호출하여 하위 클래스를 인스턴스화하면됩니다.

0

이미 언급했듯이 클래스의 생성자가 시간을 입력으로 사용하도록 구현할 수 있습니다. 이 같은 뭔가 :

공용 클래스 날짜 {

long unixtimestamp; 

public Date(long time) { 
    unixtimestamp = (long) (time * .001); 
} 

public long getUnixTimeStamp() { 
    return unixtimestamp; 
} 

}

또 다른 옵션은 그냥 변환하는 정적 메서드를 만드는 것입니다. 다른 유사한 기능을 클래스에 추가할지 여부를 결정합니다. 그렇지 않다면 정적 방법이 더 좋습니다.

0

아니요, 참조가 파생 된 유형을 가리 키지 않으면 유형을 더 파생 된 유형으로 변환 할 수 없습니다.

Calendar.getTime()이 반환 한 내용은 Date 개체 중 하나가 아니며 해당 개체가 수행하는 추가 특성 및 동작이 없습니다.

예를 들어, 상속 대신 컴포지션을 사용하도록 Date 클래스를 수정할 수 있습니다.

class Date { 

    private java.util.Date date; 

    public Date(java.util.Date date) { 
     this.date = date; 
    } 

    public int getUnixTimestamp() { 
     return (int)(date.getTime() * .001); 
    } 

}