2013-03-20 6 views
1

리턴 유형 매개 변수가 유형 매개 변수와 메소드 매개 변수 유형 매개 변수 모두를 능가하도록합니다.일반 메소드는 유형 매개 변수 및 메소드 매개 변수 유형 매개 변수의 슈퍼 유형을 리턴합니다.

import java.util.List; 
interface Foo<A> { 
    <R, B extends R> List<R> eg1(List<B> unit); 
    <R> List<R> eg2(List<? extends R> unit); 
} 

을하지만 그 R도의 슈퍼해야 적용하지 않습니다 :

이 컴파일합니다. 어떻게해야합니까?

<B, R super A & B> List<R> func(List<B> unit); 
<B> List<? super A & B> func(List<B> unit); 

그러나 사람들은 물론, 컴파일되지 않습니다

는 사실상, 나는이 표현된다 어떤 식으로 뭔가를하고 싶어.

두 가지 목적이에 있습니다

  1. 나는이 방법의 구현에서 A와 B
  2. 모두의 슈퍼 클래스에 결과를 할당 할 수 있도록하려면, 나는 결과가 필요합니다 A와 B를 모두 포함 할 수있는 유형입니다. 컴파일을 수행하는 첫 번째 예제는 결과에 A를 넣지 않기 때문에 효과가 없습니다.
+1

'R'이'A'의 임의의 상위 유형이 될 수 있고'B'가'R'의 하위 유형이 될 수 있다면'B'는 아무것도 허용되지 않습니다. 왜냐하면' R'은 언제나'Object'가 될 수 있습니다. 이 제네릭이 필요하다고 생각하는 것을 달성하기 위해 노력하고있는 것은 무엇입니까? –

+0

@LouisWasserman 귀하의 의견의 첫 부분에 대답하기 위해 질문에 세부 사항을 추가했습니다. 두 번째 ... 사실, 나는 그 일을 먼저해야만 했어. 해당 인터페이스를 구현하면 문제가 발생하며 내 질문에 대한 대답이라고 생각합니다. – mentics

답변

0

감사 @LouisWasserman의 의견에를, 나는 그렇게 처음 했어야 구현의 생각하기 시작 . 어딘가에 뭔가 반환 할 형식을 지정해야합니다. 메서드 구현시 하드 코딩되었거나 형식 매개 변수, 매개 변수 형식 param 등으로 지정되었습니다.이 사양이 어디에 있든이 인터페이스 메서드에 대해 제네릭을 올바르게 정의 할 수 있습니다.

즉, 반환 유형을 구성 할 수 없기 때문에 내가하려는 것은 의미가 없습니다.

+0

귀하의 질문에 대한 해결책으로서 귀하의 답변을 받아 들여야합니다. –

+0

@TedHopp 그렇게하기 위해 이틀 동안 기다려야합니다. – mentics

1

난 당신이 클래스 수준의 형식 매개 변수의 이름을해야합니다 생각 :

import java.util.List; 
interface Foo<Base, A extends Base> { 
    <B extends Base> List<Base> eg1(List<B> unit); 
    <R> List<R> eg2(List<? extends R> unit); 
} 
+0

+1 좋은 타협 ... – dcernahoschi

+0

고마워,하지만 그건 내가하려는 일에 흥미롭지 않아. 두 번째 유형 매개 변수를 지정해야합니다. – mentics