박광용
235
2016-02-10 13:53:11
0
534

Java variable(변수) wildcard(와일드카드) 이야기


클래스 구조는 다음과 같습니다.



제가 이야기 하고싶은것은 변수에 와일드 카드에 대하여 이야기하고 싶습니다.
public List<? extends Number> method1() {
return new ArrayList<LongAdderExtends>();
}

public <T> List<? extends T> method2(T param) {
return new ArrayList<T>();
}

public List<?> method3() {
return new ArrayList<>();
}

public List<? super LongAdder> method4() {
return new ArrayList<Number>();
}

method1는 Number를 포함한 Number를상속을 받은 객체만 가능합니다.
method2는 method1과 마찬가지입니다. 다만 generic형태로 작성되었습니다.
method3는 ?로 Object로 인식하게 됩니다.
mehtod4는 LongAdder를 포함한 상위 super 클래스들로 이루어지게 됩니다.

이제 변수를 만들고 진행해보죠.

List<? extends Number> method1List = wildcardGenericType.method1();
method1List.add(new Double(1D));
이렇게 해보았습니다. 에러가 납니다. 제 생각에는 분명 Number를 상속받고있는 Double로 add해보려고 했는데 말이죠...;

근데 아래 super로 지정한 것은 에러없이 잘되는것입니다. 희한합니다..

List<? super LongAdder> method4List = wildcardGenericType.method4();
method4List.add(new LongAdder());
method4List.add(new LongAdderExtends());

위에서 mehtod4는 LongAdder를 포함한 상위 super 클래스들로 이루어지게 됩니다.
근데 이상하지 않나요? method4List에 add하려고 하는것들은 LongAdderExtends는 하위 클래스입니다.. 그리고 extends와 다르게 오류가 안납니다.

먼가 제가 아는거와 다르게 돌아갑니다.

정확한 이유는 사실 아직까지 찾지 못하였습니다.

super로 지정한 와일드 카드는 해당 LongAdder부터 상속받은 객체를 추가할 수 있습니다.
List<Number> method1ExtendsList = (List<Number>) method1List;
method1ExtendsList.add(new Double("1"));

extends는 정확한 타입을 명시하기전까지는 add를 할 수 없습니다. Object 역시도 안되고 Null(널)밖에 안되더라구요.

분명 이유가 있을것 같은데, 인터넷을 찾아봐두 잘 나오지가 않네요..


제가 너무 당연한것을 올리는지도 모르겠습니다.ㅠ


좋은하루보내세요.

0
0
  • 답변 0

  • 로그인을 하시면 답변을 등록할 수 있습니다.