2010-03-04 3 views
3

M 타입이 어떤 타입의 서브 클래스 여야한다고하더라도, 어떤 타입을 확장하는 서브 클래스와 클래스를 리펙토링하려고합니다. 그 유형은 매개 변수화되어 있으며 매개 변수화 된 유형을 이미 M 값이있는 서브 클래스에서 사용할 수 있습니다.Extract Generic types from extended Generic

중복 K 및 V 제네릭 유형을 매개 변수 목록에 포함시키지 않고이 클래스를 정의 할 수있는 방법이 있습니까? . 나는 M 컴파일러가 서브 클래스에 의해 매핑되는 곳에서 컴파일러를 추론 할 수 있기를 원합니다.

public class NewParametrized<M extends SomeParametrized<K, V>> { 

그리고 K와 V의 유형 M.

의 정의

답변

6

문제에서 유추 할 것 :

public abstract class NewParametrized<K, V, M extends SomeParametrized<K, V>> { 

    public void someMethodThatTakesKAndV(K k1, V v1) { } 
} 

, 내가 좋아하는 뭔가를 찾기 위해 클래스 선언을하고 싶습니다 KV은 실제로 "반복 된"것이 아니며 적어도 변수 선언과 그 동일한 변수의 사용은 "반복"입니다.

이 생각할 수있는 방법은 일반 형식 KV을 선언 한 다음 일반 형식 M의 정의에서 선언 된 일반 형식을 사용하는 것입니다. 따라서 일반 유형 K 또는 V을 두 번 이상 선언하지 말고 각각을 한 번 선언 한 다음 다른 선언문에서 참조하십시오.

다른 방식으로 보면 일반 유형의 수가 여전히 K, VM입니다. MKV으로 정의되지만, 그런 식으로는 M을 정의 할 필요가 없었습니다.


난 당신이 type inference의 지지자 경우, 당신은 선언과 불필요한 반복과 같은 변수의 사용을 볼 수 있음을 추가해야합니다

. 그러나 Java (또는 C 또는 C++ 또는 기타 많은 언어)로 프로그래밍하는 데 익숙하다면 변수를 사용하기 전에 변수를 선언하는 것에 익숙 할 것입니다.

+0

그는 주로 선언을 반복하는 것뿐만 아니라 클래스를 사용할 때의 반복을 의미한다고 생각합니다. 이 클래스의 인스턴스를 참조 할 때마다 동일한 클래스를 반복해야합니다. 'NewParametrized >'와 비슷합니다. String/Integer 어커런스는 모두 선언이 아닌 사용입니다. –

+0

좋은 지적 - 나는 저자의 관점에서 볼 때, 수업 이용자의 관점에서 생각하지 않았다. 클래스 선언의 컨텍스트에서 의미가있는 경우에도 해당 축약은 불행합니다. –

2

가능했다, 선언

public class NewParametrized<M extends SomeParametrized<K, V>> { 

K 또는 V 클래스가 같은 패키지에 정의 된 경우, 형태 변수 또는 참조하는지 여부를 알고 불가능하다 모호 할 것 구체적인 클래스.

관련 문제