2010-12-19 4 views
0

타일에 대해 유감스럽게 생각합니다. 내 질문을 재개하는 법을 몰랐습니다. 일반에 일반성을 도입 할 수 있습니까?

은 내 문제를 소개하자 :

내가 제네릭 형식의 유형을 싶어.

일부 코드 :

public class AbstractDao<T, PK extends Serializable> { 
    public T getByPrimaryKey(PK primariKey) { 
    return null; 
    } 
} 

public class AbstractEntity<PK extends Serializable> { 
    PK id; 
    //Getter Setter 
} 

public class Entity extends AbstractEntity<Long> { 
} 

싶습니다 코드 변경 :

public class AbstractService<T, PK extends Serializable> { 
    AbstractDao<T, PK> dao; 

    public T getByPrimaryKey(final PK primaryKey) { 
     return dao.getByPrimaryKey(primaryKey); 
    } 
} 

public class EntityService extends AbstractService<Entity, Long> {} 

아이디어가 AbstractService 에서 "PK는 직렬화 확장"제거하고이 동적으로 그것을 얻을 것입니다.

어떻게 할 수 있습니까? 도움을

public T getByPrimaryKey(final PK primaryKey) 

감사합니다 : - > PK 나는 방법에서 "개체"대신 "PK"를 사용하지 않으려는 ... 유지해야한다.

종류는 당신이 피할 수 LongPrimaryKey 등 그 방법으로, 당신은 일반적인 PK 유형을 원하지 않는 경우

+0

"AbstractService에서"PK extends Serializable "을 제거하고 동적으로 가져 오는 것이 좋습니다." "동적으로 잡아라"는 것은 무엇을 의미합니까? 그걸로 무엇을하고 싶니? –

+0

어디에서 동적으로 가져 오나요? 그리고 현재 코드에 대해 마음에 들지 않는 것은 무엇입니까? –

답변

0

는, 당신은 다양한 구현과 실제 기본 키에 대한 래퍼로 PrimaryKey 인터페이스를 만들 수에 관하여 제네릭 형식

그러나 실제 유형 자체 (예 : Long)를 전달하려면 제네릭 유형을 둘러 볼 방법이없는 것으로 간주됩니다. 제 생각에는 올바른 위치에 배치됩니다.

0

AbstractDao의 구체적인 인스턴스를 만들면 Java는 해당 제네릭 형식을 결정할 수 있습니다.

(Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

는 당신에게 첫 번째 일반 있었던 파라미터의 실행시의 형태를 줄 것이다. 항상 사용할 수있는 것은 아니므로 문서와 함께 확인하십시오.

관련 문제