2017-12-08 2 views
2
내가 지속적으로 자바 8 날짜 시간 API를 사용하려고

, 나는이 행동 뒤에 explications을 찾고 실행 시간에 휴식 님의자바 새로운 시간 API는 컴파일하고

Instant.from(LocalDateTime.of(2017,01,01,0,0,0,0)) 

컴파일 잘하지만 수율 :

Exception in thread "main" java.time.DateTimeException: Unable to obtain Instant from TemporalAccessor: 2017-01-01T00:00 of type java.time.LocalDateTime 

내 질문은 : 이러한 유형이 호환되지 않는 이유는 무엇입니까? API가 왜 나를 코딩하고 비명을 지르지 않고 컴파일 할 수 있었습니까?

+0

(그리고 아마도 뭔가를 놓친 거지) :

(예)를 LocalDateTime를보다 효율적으로 사용에서 인스턴트을 만들려면 정적 및 동적 검사로 코드 작성 및 읽기의 편리 성. 많은 종류의 객체를 여러 메소드에 전달할 수있는 매우 일반적인 인터페이스가 있지만, (디자이너의 관점에서 볼 때) 무의미한 일을한다면 런타임에 실패하게됩니다. 'Instant.of()'의 인수 형인'TemporalAccessor'는 이러한 인터페이스 중 하나이며, 네,'LocalDateTime'이이를 구현하도록 선언되었습니다. 이것이 바로 여러분의 코드가 컴파일되는 이유입니다. –

+0

'LocalDateTime'은 특정 시점을 정의하지 않으므로 수행하려고 시도한 것이 의미가 없습니다. 따라서 불행히도 런타임에만 실패합니다. –

+1

'TemporalAccessor'는 많은 필드를 지원합니다. 'isSupported()'메소드를 통해 지원되는 필드를 질의 할 수있다. 'Instant.from()'은 필드'INSTANT_SECONDS'와'NANO_OF_SECOND'를 요구하도록 문서화되어 있으므로, 예외를 얻고 처리하는 것을 선호한다면 변환을 시도하기 전에 이것을 확인할 수 있습니다. –

답변

4

Instant.from(TemporalAccessor temporal)TemporalAccessorLocalDateTime을 허용하기 때문에 잘 컴파일은 TemporalAccessor에서 서브 클래스입니다.

런타임에서 당신은 InstantTemporalAccessor이 필드 INSTANT_SECONDSNANO_OF_SECOND이 있어야 만들 수 있기 때문에 예외가 있지만 INSTANT_SECONDSNANO_OF_SECONDLocalDateTime 제공하지 않습니다. JSR-310 균형을 유지하려고 내 개인적인 해석에

LocalDateTime localDateTime = LocalDateTime.now(); 
ZoneId zoneId = ZoneId.systemDefault(); 
Instant instant = localDateTime.atZone(zoneId).toInstant(); 

또는

LocalDateTime localDateTime = LocalDateTime.now(); 
Instant instant = localDateTime.toInstant(ZoneOffset.ofHours(0)); 
+0

확실히 새로운 시간 패키지의 다른 객체를 실제로 사용할 수 있는지 확인하기 위해 추가 검사를 할 수 있습니다. 문제는 언어의 이러한 사용을 막기 위해 만들어진 클래스 계층 구조 및 유형이 아닌지입니다. 나에게지도를 사용하여 객체를 코딩하는 것과 같습니다. 분명히 모든 객체가 호환 될 수 있지만, 실제로 함께 작동하고 런타임에 부 풀리지 않는지 확인하기 위해 많은 수표를 사용해야합니다. 나는 확실히 "Javaïst"방식이 아니었지만? – Antonin

+0

'Instant.from (TemporalAccessor)'는 다른'java.time' 클래스와 함께 사용하기위한 것이 아니기 때문에 더 나은 변환 방법이 있다고 생각합니다. 새로운 시간 API를 동적으로 만들려고 시도하기 때문에 더 많은 변환 방법을 만들지 않고도 자신 만의 시간 객체를 만들어 다른 모든 객체로 변환 할 수 있습니다. – devpuh

관련 문제