안전하게 못쓰면
에러를 띄우고싶은데서 미리 체크걸고 캐치하거나 래핑해서 반환해주는 방법이 있는데 (언어에서 귀찮지만 직접 장황하게 쓴다는말)
JVM이 제네릭을 지원안하니까
런타임에 타입정보가 소실되어버려서 이거 어케 해도 안전하게 쓰는게 불가능함
만약에
MyGen<String> 타입을 MyGen<Long> 타입으로 잘못 변환했으면
이거를 미리 체크할수가없고
Long 과 String이 불일치하는 지점까지 가서야 그때 문제가 발생함.
미리 체크가 안됨.
물론 MyGen에 이것만을 하기 위해서
getTypeClass() 를 하면
MyGen<T> 에 대해 T.class 를 반환하도록 메소드를 하나 추가하면 되는데... 라고 할줄알았지?
이것도 안됨 ㅋㅋㅋ
T.class 당연히 안되고 (T정보가 소실되어서 그냥 이런 명령어 자체를 실행시킬수가없음. T에 접근 불가능이라고 컴파일에러메세지뜸)
내부에 T data; 라는 필드가 있다는 좋은 경우에 대해
data.getClass() 하면 됨
근데 이것도, 내가 만든 클래스에 대해서만 이게 가능하고
또 흠...
에러체크를 위해서 이런 조잡한 코드가 들어간다는게 상당히 기분 나쁨.
결론은
그냥
프로그래머를 믿어라
라고 하는 수밖에 없고
에러 터지면 그때 코드를 고치는게 맞는거같음. 이 경우는 에러를 적절히 핸들링할생각말고 터지면 디버깅해서 코드를 고치는걸로
약간
C의 세그폴트처럼.
글구 가장 짜증나는건
사실 이거 실수할 일이 없음.
협업할때 초보개발자 주니어한테 제네릭 맡기면 터지겠지 라는 정도
그걸 못막는것 뿐임.
그냥 뭐 네카라도 제네릭 안쓴다며
내가 만들지 않은 제네릭에 대해서는 그게 안되니까...
나 아프고나서 정신차리고 난다음에는 진짜 공부밖에 안했어
일단 톡방 와
프로그래밍 항해일지 비번 HONESTY
지금은 회사라 내가 케어해줄수가없다. 좀이따 퇴근하고 연락할게
MyGen<String> 타입을 MyGen<Long> 타입으로 잘못 변환했으면 이거를 미리 체크할수가없고 >> 걍 ide에서 애초에 에러표시해주고 빌드하면 바로 컴파일에러나는데 개소리 길게써놧네 ㅋ
멍청하면 가만히 있으셈. getBean으로 나오는 오브젝트의 실제타입이 MyGen인데 그거를 MyGen 으로 써봐 아니 이정도로 설명해도 불충분하고 너 이해시키려면 한세월임
넌 그냥 뭐 맥락자체가 없는샛기인데 문제제기해봤자 뭘 알아듣겠냐
이거 문제 될 일이 강제 형변환이나 리플렉션 정도일텐데 강제형변환만 최소화 시키면 되지 않음?ㅇㅅㅇ
ㅇㅇㅇ 지금 경우가 강제형변환인데, 이거 안전하게 래핑해주려다가 (인턴 잘 쓰라고) 그냥 주석으로 워닝 크게 달아놓고 끝냈음
강제형변환이랑 리플렉션 두가지 모두의 경우임 지금 내가 이거 안전하게 절대못쓴다고 지지친부분이
이게 제네릭이라는 개념은 원래 존나 쉬운게 맞고 쉬워야 정상인데, 자바가 만들어질당시에 제네릭개념이없었어가지고 자바의 제네릭이 어려운거같음. 솔직히 뭐 이건 그냥 뭐 제네릭이 진짜 좀 더러움
내부적으로 Object로 취급하는데, 이거 런타임에 체크하려면 성능 손실나고 완벽하게 체크도 어려움. 체크하더라도 어차피 에러 띄울텐데 캐스팅 에러 띄우는게 합리적이지ㅇㅅㅇ
캐스팅에러가 안뜸 자바 캐스팅이나 instanceof에서 제네릭 못잡음. 캐스팅에러가안뜨니까 그냥 나중에 이 객체를 쓰다가 에러가 어디서터질지를 모름
캐스팅 할때말고 제네릭 관련 호출할 때 뜨자나ㅇㅅㅇ
빈을 가져와서 캐스팅한 후 반환 하는건데 얘를 반환하는 순간 에러가 관리안된채 떠돌게 됨. 그렇다고 미리 문제될상황들을 체크해서 미리 문제일으켜보는것도 빈의 타입이 뭐냐에따라 검증로직이 달라짐
빈을 반환하는게 문제다? 라기엔 안티패턴이라기보단 자바의 한계라고 생각함. 제네릭타입이 아닌 빈은 반환하는데 아무 문제 없음
그래서 여튼 빈이 제네릭타입일때 그걸 다 쓰고 폐기해야하거든? 밖으로 갖고나가면 안됨. 근데 난 이번에 하나를 밖으로 갖고나왔어 이거 자바의 안티패턴인 셈임
다 쓰고 폐기하고안쪽에서 에러관리를 하면 되는데얠 바깥쪽으로 가져나가는순간 문제가 됨.글구 이런거 있지여기서 이게 됐다는건 제네릭파라미터가 올바르단거다이런 추론 가능한데나는 그것마저 추상화되어있어서그런 간접 증명까지 안됨
그걸 언어 레벨에서 체크하긴 어렵지ㅇㅅㅇ