아이템 32. 핵심 정리 12:00 이 부분에서 질문이 있습니다.
504
작성한 질문수 77
String[] attributes = pickTwo("좋은", "빠른", "저렴한");제가 자바 기초가 약해서 이해를 못하는걸까요? ..
bytecode로 확인하면
pickTwo 메소드를 반환하게 된다면 Object(추상적) 형식으로 반환 해서 String(구체적) 형식으로 변환(타입 케스트) 해서 문제(ClasscastException)가 발생된다고 해주셨는데요
그러니깐
구체적 -> 추상적 으로 변환 문제없음
추상적 -> 구체적 으로 변환 문제 있음
결론은 이것인데
Object obj = new Object();
obj = "test"; // 추상적인 Object 에 담음
String string = (String) obj; // 구체적인 String 에 담음해당 원인이라면 해당 소스는 에러가 발생해야 되는것이 아닌가요?....
자바 기초가 약해서 그런지 조금 이해가 안되는 부분이 있어서 질문 드립니다.
답변 1
0
제가 이해한 내용으로 적는 거라서 틀릴 수도 있지만, 답변 남겨봅니다.(틀린 내용 있으면 피드백해주세요!)
먼저 질문자님이 주신 예시 코드의 경우에는
Object obj = new Object();
obj = "test"; // 추상적인 Object 에 담음
String string = (String) obj; //이 경우에는 "test" 객체 자체가 String 클래스이므로 캐스팅을 이용해서 String <-> Object의 이동이 자유롭습니다.
반면에 toArray(T... args)의 경우 가변 인수를 Object[]를 생성합니다.(194p 3번째 줄, 이 부분에 대한 자세한 내용은 타입 이레이저(Type Erasure)를 검색해보시면 될 꺼 같습니다.)
가변 인수를 보관하는 Object[] 객체는 위에서 "test"라는 '객체 자체'가 String이라서 String <-> Object 캐스팅이 자유로웠던 것과는 달리 Object[]가 String[]으로 다운 캐스팅될 수 없습니다.
그래서 String[] attributes = (String[]) Object[] 이 부분에서 컴파일러의 캐스팅 과정 중 에러가 발생하는 거라고 생각하시면 될 것 같습니다.
제 블로그에 더 자세하게 Type Erasure 과정과 함께 타입 에러 발생 과정을 적어두었으니 필요하시다면 참고해주세요!
SQL 집중학습
0
14
1
NULL과 0
0
11
1
26년 1회 기출문제 11번 질문드립니다
0
18
1
경력기술서는 어떤 방향이 좋을까요?
0
13
2
업캐스팅 문제예시5 & 업캐스팅 문제 예시 6
0
15
1
V1.2 VS V.091
0
20
2
split('T')일때는 T만 제거되는거고 공백은 제거되지 않는 건가요?
0
21
2
파이썬 언어 업데이트, 언어별 학습자료 업데이트
0
28
2
C, java, python 언어 기출문제 강의 질문
0
23
2
Spring AI 프레임워크를 사용하지 않은 이유
0
22
1
단일 테이블 시 null 값과 연관관계 필요성 질문
0
15
1
1:26 에서 반복문 i[1] 이니까 0 다음 두번째 항목들 아닌가요
0
19
2
d
0
23
2
출력값
0
30
2
무료행사(2) 투포인터 코드 질문 드립니다.
0
18
0
(기출) 2023년 3회 코드해석 문제의 1:10입니다.
0
26
2
23년도 2회 c언어 0:03 n[(i+6)%5] 도 가능한건가요?
0
29
2
SpringBoot4 버전 Hibernate5JakartaModule 라이브러리 오류
0
21
1
강의 소스 코드 관련 질문 드립니다.
0
45
1
아이템 28 타입 안전
0
432
1
아이템19 - 구체 클래스가 표준 인터페이스를 구현하지 않았는데 상속을 금지하면 사용하기에 상당히 불편해진다.
1
451
2
다음 강의 질문
0
450
1
아이템16, 조금 애매한 것 같습니다.
0
601
1
아이템31 비한정적와일드카드
1
379
0





