해결된 질문
작성
·
189
0
제네릭은 new를 하면 타입 이레이저 때문에 Object가 되어버려서 new를 할 수 없다고 하셨는데,
Node<E> newNode = new Node<>(e);
이것도 E부분이 Object로 변하니까 new 생성을 못하는
이거는 왜 가능한 건지 이해가 되지 않습니다 ㅠ
public class MyLinkedListV3<E> {
private Node<E> first;
private int size = 0;
public void add(E e) {
Node<E> newNode = new Node<>(e);
if (first == null) {
first = newNode;
} else {
Node<E> lastNode = getLastNode();
lastNode.next = newNode;
}
size++;
}
답변 1
2
안녕하세요. 권정익님
문제가 되는 부분은 제네릭 타입을 직접적으로 인스턴화 할 때 발생합니다.
예를 들어서 new T()
와 같이 작성하면 문제가 됩니다.
Node<E> newNode = new Node<>(e);
이 구문이 가능한 이유는 타입 소거가 Node
클래스의 인스턴스 생성을 방해하지 않기 때문입니다. 실제로 Node
클래스의 생성자는 E
타입의 객체를 받을 수 있습니다. 여기서 중요한 것은 생성자가 제네릭 타입을 직접적으로 인스턴스화하지 않는다는 것입니다. 즉, Node<E>
안에서 E
타입을 생성하려 할 때는 문제가 될 수 있지만, 단순히 E
타입의 참조를 저장하는 것은 문제가 되지 않습니다.
감사합니다.