2009-11-19 3 views
2

Collection<T> 있습니다. U31 인터페이스를 구현하는 클래스 TManager가있는 getCollection()은 U가 인터페이스 인 Collection<U>을 반환해야하고 T는 U를 구현하는 클래스입니다.Java : 콜렉션을 콜렉션 <U super T>

return (Collection<U>)Tcoll;,이 문제를 해결하는 더 정확한 방법이 있습니까?

여기서는 4 개의 클래스/인터페이스를 모두 제어합니다. 나는

public Collection<? extends U> getCollection() 

이어야한다

public Collection<U> getCollection(); 

UManager.getCollection 선언에 잘못된 건가요?

+0

코드 예제가 다소 혼란 스럽습니다. 'U'또는 'Collection '을 반환 하시겠습니까? 적어도 클래스/메소드는 T가 U. – BalusC

+0

콜렉션 의 구현임을 지시해야합니다. 나쁘다. 나는 내가 의미하는 것을 타이핑하지 않았다. –

+0

또 다른 혼란은'U'와'T'는 실제로 인터페이스와 구현 클래스의 이름입니까 아니면 그냥 일반적인 유형입니까? – BalusC

답변

3

컬렉션과 관련하여 필요한 작업에 따라 다릅니다. 반환 된 컬렉션에 무엇이든 넣을 필요가없는 경우 extends 매개 변수를 사용하십시오.

public interface UInterface { 

     Collection<? extends UInterface> getCollection(); 

    } 

그리고 끝내십시오. 나중에 컬렉션에 추가하고 새 컬렉션에 래핑하고 모든 작업을 추가해야하는 경우에는 아무것도 수행하지 않아도 성능이 무시됩니다 (컴파일 타임 문제로 인해 추가 런타임 성능이 저하됨).

하는 경우는, 그러나, 목적이 변경 가능한 콜렉션을 반환하는 것입니다, 당신은 당신의 인터페이스 유형 매개 변수를 추가 할 수 있습니다

public interface UInterface<T extends UInterface> { 

     Collection<T> getCollection(); 

} 

그런 다음 구현은 다음과 같습니다

public class TClass implements UInterface<TClass> { 

     pubic Collection<TClass> getCollection(); 

} 

문제를 이 접근 방식을 사용하면 인터페이스에서 변경 가능한 컬렉션을 가져 오거나 구체적인 클래스를 참조하기 위해 런타임에 유형 매개 변수를 반드시 가져야합니다.

+0

예, 불변의 콜렉션입니다. 변경 가능한 컬렉션의 경우 일반적으로 컬렉션을 입력 매개 변수로 전달하는 것이 좋습니다. 'public void getCollection (Collection collection)' –

+0

아하,'Collection '을 돌려 줄 수있다. Java 5가 공변 리턴 타입을 지원하기 때문에 UInterface>'를 확장합니까? –

+0

@ Jason S, Java 5는 공변 리턴 유형을 지원하지만, 공변 리턴 유형으로 인해 가능한 일반 매개 변수를 기반으로하는 다른 리턴 유형을 허용합니다. Collection 과 Collection 은 공 변하지 않으므로 Generic 매개 변수는 런타임에 지워집니다. 이 경우에는이를 완료하는 데 사용할 수있는 type 매개 변수입니다. – Yishai

1

내가 원하는 생각 :

public Collection<? extends U> getCollection();

당신이 here.

@ 제이슨에 대한 몇 가지 공식 문서를 찾을 수 있습니다, 당신 말이 맞아. 문서는 반환 형식을 명시 적으로 호출하지 않지만 제대로 작동합니다.

public Collection<? extends Throwable> getErrors() { 
    return new ArrayList<Exception>(); 
} 
+0

@saleem : 게시 한 링크가 반환 형식을 확장하는 와일드 카드에 대한 세부 정보로 들어 가지 않습니다. –

2

그것은해야한다 :

public Collection<U> getCollection(); 

avoid bounded wildcards in return types하려고 여기에 구문을 보여주는 예제 방법입니다.

서브 클래스는 단지 Collection<T>이 아닌 Collection<U>으로 반환 된 참조 유형을 선언합니다. 그것은 당신의 캐스트를 제거합니다.

그러나 반환 유형에 바운드 와일드 카드가 있어야하는 경우 Collection<? extends U>을 반환해야하며 캐스트가 필요하지 않습니다.

+0

@notnoop : 콜렉션 이 있었으며 컴파일러는 캐스팅없이 컬렉션 을 반환하지 않았습니다. –

1

한 문자 식별자가 일반적으로 제네릭 형식에서 사용되기 때문에 topicstart가 다소 혼란 스럽지만 인터페이스와 클래스에 대해 명시 적으로 언급했습니다.그래서 이걸 찾고 있니?

interface UManager<T extends UInterface> { 
    Collection<T> getCollection(); 
} 

class TManager implements UManager<TClass> { 
    public Collection<TClass> getCollection() { 
     return Arrays.asList(new TClass(), new TClass()); 
    } 
} 

interface UInterface { 

} 

class TClass implements UInterface { 

} 
+0

별로 ... 나는 형식 매개 변수를 사용할 수 있다고 생각하지만 차라리하지 않을 것입니다. 좋은 지적이지만! (+1) –

관련 문제