Introduction
Posts
Q&A
hashCode를 오버라이딩 했을때 반환하는게 틀려요.
AI 답변에 추가하면 IntelliJ를 통해 각 메소드를 따라가보면 다음과 같습니다.public final class Objects { public static int hashCode(Object o) { return o != null ? o.hashCode() : 0; } public static int hash(Object... values) { return Arrays.hashCode(values); } } public final class Arrays { public static int hashCode(Object[] a) { if (a == null) return 0; int result = 1; for (Object element : a) result = 31 * result + (element == null ? 0 : element.hashCode()); return result; } }따라서 hashCode(id) + 31 = hash(id)로 나옵니다.또한 IntelliJ의 자동완성 기능은 AI 답변과 같이 매개변수가 하나이기 때문에 hashCode()를 추천한 것으로 보입니다.
- 1
- 2
- 241
Q&A
제네릭 상한 설정을 위해 생성자를 활용하는 것이 extends보다 못한 점이 무엇인가요?
생각하는자 님의 답변에 첨언하면, Box에서 T는 아무 클래스나 올 수 있기 때문에 다음과 같은 코드도 가능합니다.Cat cat = new Cat("고양이", 100); Box foodBox = new Box(cat);이때 Animal → Food로의 변환은 타입매개변수 T를 사용하기에 컴파일러가 확인하지 않아 오류가 발생하지 않습니다.그런데 만약 Box에public T getAnimal() { return animal; }와 같이 getAniaml()이 있다면,Food food = foodBox.getAnimal();에서 Animal → Food 로 타입을 바꾸려 시도하기 때문에 ClassCastException이 발생합니다.따라서 클래스 내 모든 T에 제약을 걸기 위해 을 사용하는 것입니다.
- 0
- 2
- 83
Q&A
다운캐스팅
System.out.println(obj);로 출력하는 경우 println() 내부적으로 Object 클래스의 toString() 메소드를 호출하여 String 객체를 사용하기에 문제가 없습니다.
- 0
- 2
- 65