2013-07-24 2 views
0

그래서이 코드를 사용하여 YAML 파일을로드하고 있습니다.SnakeYAML이 일반적으로 사용할 수없는 객체를로드합니다

String file = "A: true\nB: 5" 
Yaml yaml = new Yaml(); 
Map settings = (Map) yaml.load(file); 

System.out.println(settings.get("A")); 

마지막 줄 인쇄이 : 예상된다

class java.lang.Boolean 

. 그러나, 나는 실제로 기본 경우 - 문 예를 들어, 부울를 사용하려고 할 때 다음의 경우 문이 기대 것을 말해

java: incompatible types 
    required: boolean 
    found: java.lang.Object 

:

if (settings.get("A")) { 
    System.out.println("We want to do A!"); 
} 

이 명령하면 오류가 발생합니다 boolean하지만 대신 java.lang.Object를 수신했습니다. 이것은 나 혼란 스럽다. 왜, 객체 클래스를 얻었을 때, 내가 원하는 타입을 반환 하나, 그 타입의 컨텍스트에서 그 객체를 사용할 수 없습니까?

처음에는 SnakeYAML이 기본 유형이 아닌 Object 유형의 서브 클래스를 리턴한다는 사실을 알지 못했습니다. 몇 가지 테스트와 소량의 생각을 통해, 나는 그것이 내 문제의 원인이 아니라는 것을 깨달았습니다.

각 값을 해당 유형으로 캐스팅하여이 오류를 수정할 수 있음을 알았지 만 YAML 파일에는 참조 할 때마다 수동으로 캐스팅하지 않으려는 다양한 값이 포함되어 있습니다. 처음에는 YAML 사용에 대한 나의 목적을 다소 상쇄합니다.

어쨌든, 부울 을 부울으로 생각하는 객체를 사용할 수없는 이유에 대한 통찰력은 크게 감사하겠습니다.

답변

0

이것은 순수한 자바 문제입니다. 개체 키와 객체 값을 가질지도 (유형 템플릿 없음) -

Map settings = new HashMap(); 
if (settings.get("A")) { 
    System.out.println(); 
} 

는 당신에게 같은 이유로 같은 컴파일러 오류를 줄 것이다.

그러나 형식 템플릿을 사용하면 컴파일 타임에 값 유형을 알 수 없기 때문에 도움이되지 않습니다. 그것에 대해 생각하십시오 : 입력을 "A : hello \ nB : 5"로 변경하면 settings.get ("A")의 런타임 유형이 java.lang.String이됩니다.

따라서 입력을 부울 값이 아닌 값으로 변경하면 명시 적 형변환을 계속 수행하고 ClassCastException을 가져야합니다.

관련 문제