2013-10-10 1 views
1

저는이 일반 유형을 처음 사용합니다. 아래 코드에서 "String"을 확장하는 항목 목록을 받아들이는 메서드를 만들었습니다.일반 확장에서 같은 유형을 추가 할 수 없습니다.

내 질문은 무엇입니까? - 목록에 새 목록이 지정 될 수있는 경우 왜 "test"문자열을 추가 할 수 없습니까? 그러면 컴파일 오류가 발생합니다.

public class Child { 
    public void takeList(List<? extends String> list){ 
     list = new ArrayList<String>(); 
     list.add("test"); 
    } 
} 

답변

1

여기는 관련 런타임 유형이 아니기 때문에. list은 여전히 ​​List<? extends String> 유형이며, 방금 new ArrayList<String>()에 할당했습니다. 이것을 고려하십시오 :

list = rand() ? new ArrayList<String>() : new ArrayList<NotString>(); 

컴파일러를 list.add("test")이 유효합니다 경우 아마도 말할 수 없습니다 - 그것은 단지 list의 컴파일 타임 유형에 따라 결정을 내립니다.

실제로는 String을 확장하지 않으며, final 클래스입니다.

0

약간의 차이가 있습니다. 하나의 유형 (문자열을 확장하는 것)을 포함하는 목록을 취합니다. 이 목록은 String의 하위 클래스 일 수 있으므로 String iyswim이 될 수 없습니다. http://docs.oracle.com/javase/tutorial/java/generics/upperBounded.html 상위 제한된 와일드 카드를 참조하십시오.

이 목록이 문자열을 받아 들일 수 있도록 보장되기 때문에

 public void takeList(List<? *super* String> list){ 

그런 다음 당신이 그것을에 문자열을 추가 할 수 있었다면.

0

와일드 카드가있는 변수와 일반 유형 매개 변수를 사용하는 메소드가있는 경우 Java는 유형 안전성을 보장 할 수 없습니다. 이 전화를 거부해야합니다.

예를 들어 List<? extends Animal>을 고려하십시오. 이 변수에 List<Dog>을 할당했지만 변수에 List<Squid>을 할당 할 수 있습니다. 이러한 목록에 Dog을 추가 할 수 없습니다.

add 메서드를 호출하려면 와일드 카드를 제거하십시오.

public void takeList(List<String> list){ 

게다가, String is final, 그래서 거기에 정말 ? extends String 말에 아무 소용이 없다.

관련 문제