2019. 4. 16. 11:40ㆍ[개발] 기록
문제 상황
@Data
public class ParentElement{
public String message;
}
@Data
public class ChildElement extends ParentElement{
public String message;
}
@Data
public class Parent{
public List<ParentElement> elements;
}
@Data
public class Child extends Parent{
public List<ChildElement> elements;
}
Child 의 elements가 Parent의 elements를 오버라이딩 한 코드를 만들고 싶다.
문제 해석
1. lombok 은 Child의 elements에 대응하는
public List<ChildElements> getElements() { return elements; }
public void setElements(List<ChildElement> elements) {this.elements = elements;}
를 만드려한다.
2. lombok 은 Child의 부모클래스 public List<ParentElement> elements; 에 대응하는
public List<ParentElement> getElements() { return elements; }
public void setElements(List<ParentElement> elements) {this.elements = elements;}
를 만드려한다.
3. 1번과 2번에서 만든 getter와 setter가 충돌을 일으킨다.
다른 타입을 반환하는 같은 이름의 메소드가 존재하기 때문
문제 해결
방법 1. 리스트 말고 배열을 쓴다. List입장에서는 Generic에 들어가는 클래스의 타입간의 상속관계를 알 수 없다. 배열은 상속 관계를 표현할 수 있다.
@Data
public class Parent{
public ParentElement[] elements;
}
@Data
public class Child extends Parent{
public ChildElement[] elements;
}
방법 2. getter setter 만 따로 지정해주고 멤버변수를 선언을 아예 하지 않는다.
//@Data
public class Child extends Parent{
//public List<ChildElement> elements;
public List getElements() {
return super.getElements();
}
public void setElements(List elements) {
super.setElements(elements);
}
}
나중에 get set을 호출할 때 List<ChildElement>()으로 접근하면 된다.
List<ChildElement> list1 = Child.getElements();
List<ChildElement> list2 = new List<ChildElement>();
Child.setElements(list2);
'[개발] 기록' 카테고리의 다른 글
Java Optional class (0) | 2019.04.25 |
---|---|
Reactive connection with DB (0) | 2019.04.18 |
Jackson Error - InvalidDefinitionException: Direct self-reference leading to cycle (0) | 2019.04.16 |
[2019.04.06] SpringBootTest, SpringJpaTest (0) | 2019.04.06 |
[2019.04.06] Mock, MockBean (0) | 2019.04.06 |