2014-09-29 3 views
1

ArrayList를 을 복용 방법에 ArrayList를 를 통과 할 수 없습니다. 은 내가 인터페이스를 구현하는 클래스가

public class Something { 
    public static void function(ArrayList<IFoo> foos){ 
     //do something on foos 
    } 
} 

내가 푸의 배열 목록에이 기능을 사용하려면 :

ArrayList<Foo> myFoos = new ArrayList<Foo>(); 
Something.function(myFoos);//can NOT do this 

어떤 문제가 아니면 내가 무엇을 할 것인가?

+2

약간 주제와, 그러나 왜 안'공공 정적 무효 기능 (IFoo, FOOS ...)'? – Leon

+0

나는 @ 레온에 동의한다. 인터페이스 *로 코딩하는 것이 좋습니다. – TheLostMind

+0

당신의 인터페이스 이름은 IFoo이고 당신이 생성하는 arraylist는 Foo를위한 것입니다. 그러나 Something 클래스의 함수 시그니처에서 올바르게 언급했습니다. –

답변

6

구조에 제네릭!

public static void function(ArrayList<? extends IFoo> foos){ 
    //do something on foos 
} 

이제 함수는 포함 된 타입 중 IFoo 또는 이로부터 파생되는 배열에서 어떤 종류 걸린다.

가능한 한 가장 일반적인 유형을 사용하는 것이 좋습니다. ArrayList이 정말로 필요합니까, 아니면 List일까요? 아니면 어떤 종류의 Collection일까요?

public static void function(List<? extends IFoo> foos); 
public static void function(Collection<? extends IFoo> foos); 

좋은 규칙은 be conservative in what you send and liberal in what you accept from others입니다. 더 일반적인 매개 변수 유형을 사용하는 것은 "자유 주의적"일 것입니다.

+0

감사합니다. 콜렉션 유형이 다를 수 있습니다. –

0

당신은 사용 제네릭하여 작업을 수행 할 수 있습니다

public static void function(ArrayList<? extends IFoo> foos){ 

} 

그래서 문제는 쉽게 해결하세요된다.

1

내가 아마 같은, (AN List<IFoo>을 받아 제외) 및 인터페이스 유형의 사용을 촉진 변경하는 방법 서명을 떠날 것이다 :

List<IFoo> myFoos = new ArrayList<IFoo>(); 

List<Foo>를 사용하는을 필요로 경우 - 다시, 멀리 ArrayList! - 그럼에도 불구하고 나는 더 간단한 서명을 유지하고 호출자에게 적절하게 캐스트하거나, 그렇지 않으면 List<IFoo> 표현을 제공하여 호출 사이트에서 그러한 작업의 책임을 맡을 것입니다.

은 (내가 하위 유형에 대한 대부분 편견 해요, 때 실제 전적 covariance issue을 회피하는 것을 선호합니다.)

+0

좋아, 내가 물지. 왜 당신은 하위 유형에 편향되어 있습니까? –

+0

@JohnKugelman 상속 subtype-relationsips로 그다지 하위 유형이 지정되지 않습니다. 주로 정의 된 인터페이스 계약을 넘어서서 LSP (특정 인터페이스 계약을 넘어서서)와 구체적인 유형에 대한 의존도가 증가했습니다. – user2864740

+0

아, 잡았다. 나는 너와 거기에 동의한다. 와일드 카드 한정어에 대해 뭔가 있다고 생각했습니다. 그것은 끔찍한 특이한 것이 될 것입니다.;-) –

관련 문제