2012-12-04 3 views
1

다음은 Java에서 작동하지 않는 이유를 파악하려고합니다. , 원java 생성자에서 추상 클래스 목록을 가져올 수 있습니까?

public abstract class Shape { 

} 

이 두 가지 구체적인 클래스를 가지고 말할 수 있습니다 :

public class Square extends Shape { 

public Square(Shape shape) 
{ 
    // nothing 
} 

public Square(List<Shape> shapes) 
{ 
    // nothing 
} 
} 

을 감안할 때 : 여러 생성자가

public class Circle extends Shape { 

} 

및 광장, 여기에

는 기본 추상 클래스입니다 이 코드 :

Circle c = new Circle(); 
List<Circle> cList = new ArrayList<Circle>(); 
Square s = new Square(c); 
Square s2 = new Square(cList); 

마지막 줄은 오류 발생 :

The constructor Square(List<Circle>) is undefined. 

을하지만 매개 변수 List<Shape> 소요 광장에서 생성자를 가지고 있고, 서클는 모양입니다 - 하나의 모양이 괜찮 취하는 생성자입니다. 그래서 나는 왜 내가이 오류를 이해하는지 모르겠다. 당신의 도움을 주셔서 감사합니다.

을 의미
 public Square(List<? extends Shape> shapes) 
     { 
      // nothing 
     } 

Shape를 확장하는 모든 클래스를 받아들로

답변

5

은 생성자를 정의합니다.

사전주의 사항 : 동일한 사실로 인해 발생하는 부작용도 알고 있어야합니다. 즉, Shape을 확장하는 모든 클래스를 허용합니다.

+0

빠른 응답 감사합니다. 몇 달 동안 Java로 작업했지만 전에 와일드 카드 유형 매개 변수를 보지 못했습니다. – JasonK

0

But I have the constructor in Square which takes the parameter List, and Circle is a Shape - the constructor that takes a single Shape is fine.

제네릭 형식이 Java에서 변하지 않기 때문입니다. Circle은 -Shape이지만 여전히 List<Circle>은 -이 아니므로 List<Circle>List<Shape>으로 대체 할 수 없습니다. 이 간격을 메우기 위해 @Yogendra가 지적한 바운드 와일드 카드를 사용해야합니다.

설명 here을 찾을 수 있습니다.

관련 문제