오늘 나는 객체가 올바른 유형으로 형 변환 될 수 없더라도 기존 Map
에있는 객체를 put
수 있다고 발견했습니다.초기화 된 맵에 일치하지 않는 유형의 객체를 넣는 - 예상되고 합법적입니까?
먼저, 내가 간단한 예제로 시작하자 : 당신이 하지가 이미 구축지도에 일관성이 형식의 개체를 넣을 수있을 것 같은
Map<Integer, String> myMap = new HashMap<>(); //plain old hashmap
myMap.put(9,"star"); //no problem
myMap.put(10, 1.2); //Incompatible type, the compiler yells
Map<Integer, Double> aMap = (Map<Integer, Double>) myMap; //Cannot cast, the compiler yells
지금까지, 모든 것이 예상된다. 지도는 이것을 달성, 그리고 않는 방법 JLS 또는 API에 지정된이 동작하며, 따라서 의존 할 수있다 -
public class NoRulesForMe {
static Object theRing;
public static void main(String[] args){
Map<Integer, String> myMap = new HashMap<>();
myMap.put(9,"star");
Map<Integer, Double> myMapMorphed = castWildly(myMap);
myMapMorphed.put(99, 3.14);
System.out.println(myMapMorphed.get(9)); //"star", as we put in
System.out.println(myMapMorphed.get(99)); //3.14, as we put in
}
public static <T> T castWildly(Object value){
theRing = value;
T morphed = (T) theRing;
return morphed;
}
}
나는이 런타임 오류가 발생하지 않았다 놀랍가 : 이제이 문제를 살펴 보자 ?
이유 나는 이것이 프로덕션 코드에서 (더 복잡한) 버전을 보았고, 이것이 어수선하고 냄새가 심할지라도 기능적으로 작동하도록 보장 할 수 있는지 궁금합니다. 모든 입력을 부탁드립니다.
Google "입력 삭제"가 필요합니다. –
이것은 Java가 제네릭을 구현할 때 _inherent_입니다. –
@ 루이스 와서 만 Java generics에 내재 된 * 내용을 자세히 설명해 주시겠습니까? 나는 컴파일러가 불평하지 않았다는 것에 놀랄 필요가 없다. 하지만 더 큰 질문은 Java가'Double'을'String'으로 저장하는 방법입니다. – flow2k