2014-11-05 2 views
1

"Thinking in java"의 제네릭 장을 읽었습니다. 이 프로그램은 아래에 있습니다. 아래Bruce Eckel의 "Thinking in Java"의이 제네릭 예제가 잘못 되었습니까?

public class GenericWriting { 
    static <T> void writeExact(List<T> list, T item) { 
     list.add(item); 
    } 
    static List<Apple> apples = new ArrayList<Apple>(); 
    static List<Fruit> fruit = new ArrayList<Fruit>(); 
    static void f1() { 
     writeExact(apples, new Apple()); 
     // writeExact(fruit, new Apple()); // Error:------------------line 1 
     // Incompatible types: found Fruit, required Apple 
    } 
    static <T> void writeWithWildcard(List<? super T> list, T item) { 
     list.add(item); 
    } 
    static void f2() { 
     writeWithWildcard(apples, new Apple()); 
     writeWithWildcard(fruit, new Apple()); 
    } 
    public static void main(String[] args) { f1(); f2(); } 
} 

는 writeExact() 메소드는 정확한 매개 변수 유형 (와일드 카드)를 사용한다 "말했다. F1()에서 당신 만 List<Apple>에 애플을 넣어이 미세 오래 작동하는지 확인할 수 있습니다. 그러나 writeExact()를 사용하면 가능해야한다고 알고 있더라도 List<Fruit>에 Apple을 넣을 수 없습니다. "

하지만 줄 1의 주석을 제거하고 실행하면 문제가 없습니다. 아무도 나를 잘못한 곳에서 도울 수 있습니까?

+3

을 쓰고 싶다 생각합니다. –

+0

내가 잘못 한 것은이 책을 선택하는 것 뿐이라고 생각합니다. –

+0

이 책의 네 번째 버전 [here] (http://www.saeedsh.com/resources/Thinking%20in%20Java%204th%20Ed.pdf)을 다운로드 할 수 있으며,이 예제는 486 페이지 (508 페이지 중)에 있습니다. PDF). 또한 제 3 판을 살펴 봤는데이 예제는 그 중 하나와 동일합니다. –

답변

0

다형성 지정은 기본 유형에만 적용되고 제네릭 유형 매개 변수에는 적용되지 않습니다. 당신은 당신은 말할 수 없다

List<Animal> aList = new ArrayList<Animal>(); // yes 

말할 수

List<Animal> aList = new ArrayList<Dog>(); // no 

와일드 카드 구문은 일반적인 방법은, 메소드 인수의 선언 형의 아형 (또는 슈퍼 타입) 받아 들일 수 있습니다 :

void addD(List<Dog> d) {} // can take only <Dog> 
void addD(List<? extends Dog>) {} // take a <Dog> or <Beagle> 

와일드 카드 List<? extends Dog>을 사용하는 경우 컬렉션은 액세스 할 수는 있지만 수정되지는 않습니다. 일 수 있습니다.

+0

에게 고맙다는 말을 할 수 있지만 질문을 다시 읽으십시오. 아무도 여기에 다형성 할당을 수행하려고하지 않습니다. –

3

그러나 writeExact()은 해당이 가능해야한다 알면서도, 당신은 List<Fruit> 내로 Apple를 넣을 수 없습니다.

올바르지 않습니다. writeExactAppleList<Fruit>에 넣을 수 있습니다. <T>Fruit으로 추정되고 Apple (아마도)은 Fruit의 하위 유형입니다.

책이 작성된 Java 버전을 확인해야합니다. 자바의 오래된 버전에서는 컴파일러의 추측이 적기 때문에 컴파일되지 않을 수도 있습니다. 그렇지 않으면 책에 오류가 있습니다.

이것은 내가 확인할 수있는 Java 6+에서 컴파일됩니다.

+0

제네릭을 도입 한 버전이기 때문에 Java 5로 컴파일되므로 이론이 유효하지 않다고 생각합니다. –

+0

@ChrisMartin 그런 다음 책에 오류가 있습니다.나는 저자에게 의심의 이익을주고 있었다. – Radiodef

-1

는 당신이 사람들이 어떤 들여 쓰기를 사용하는 종류의 충분, 코드를 읽을 수 있도록하려면 저자 대신 라인 static List<Fruit> fruit = new ArrayList<Fruit>();static List<? extends Fruit> fruit = new ArrayList<Fruit>();

+1

나는 이것이 대답이 아닌 대답이라고 생각하기 때문에 투표가 완료되었습니다. – SeeuD1

관련 문제