2012-04-09 4 views
2

제네릭을 사용하여 코드를 작성하려고하지만 @SuppressWarnings을 사용하는 방법을 알아낼 수 없습니다.@SuppressWarnings을 사용하지 않고이 제네릭을 올바르게 코딩하는 방법

나는 다음과 같습니다

/** 
* Cache to know which pool provided which object (to know where to return object when done) 
*/ 
private Map<Object, ObjectPool<?>> objectPoolCache = new ConcurrentHashMap<Object, ObjectPool<?>>(); 

/** 
* Returns a borrowed pool object to the pool 
* @param o 
* @throws Exception 
*/ 
public void returnToPool(Object o) throws Exception { 
    // safety check to ensure the object was removed from pool using this interfact 
    if(!objectPoolCache.containsKey(o)) 
     throw new IllegalStateException("Object is not in pool cache. Do not know which pool to return object to"); 

    // get the object pool 
    ObjectPool pool = objectPoolCache.remove(o); 

    // return the object to the pool 
    pool.returnObject(o); 
} 

는 지금, 나는 ObjectPool pool 원시 타입과 return 문에 유형 안전 경고임을 경고를 얻을.

내 개념은 다음과 같습니다. 객체/풀 쌍의 맵을 만들어서 객체를 반환 할 풀을 알기 위해 객체 풀을 알아 냈습니다.

ObjectPool은 모든 유형의 객체의 ObjectPool 일 수 있습니다. 특정 상위 유형이 필요하지 않습니다.

나는 <? extends Object>을 사용해 보았지만 컴파일 오류가 발생하지 않고 사용하는 방법에 대해서는 잘 모르겠습니다. <?><? extends Object>으로 바꾸면 내 메서드가 Object를 매개 변수로 사용하는 문제가 발생합니다.이 문제는 Object를 확장하는 풀과 일치하지 않습니다.

도움을 주시면 감사하겠습니다.

감사합니다.

에릭

답변

3

이 자바의 타입 시스템이 Map 일부 ObjectPool<? super T>에 유형 T의 모든 개체를 매핑하는 제약 조건을 표현 지탱할 수없는 이유만으로, @SuppressWarnings없이 행할 수 없습니다.

제네릭은 Java에서 다양한 작업의 유형 안전성을 증명하기 위해 설계되었지만 수행중인 작업에 충분히 강력하지는 않습니다. 컴파일러에게 "당신이하고있는 일을 안다고 믿어야합니다"라고 말하면됩니다. 이것은 @SuppressWarnings을위한 것입니다.

+0

그게 제가 생각한 것 뿐이지요.하지만 제네릭 통찰력이 더 많은 사람이 멋진 해결책을 가지고 있다고 생각했습니다. 맞춰봐. :) –

1

Java generics에서는이를 수행 할 수 없습니다. 하지만 귀하의 개체 풀 캐시가 Map<Class<?>, ObjectPool<?>> 또는 Map<Object, ObjectPool<?>>으로 일반화되어야하는지 궁금합니다.

+0

아니요 - 어떤 개체가 어떤 풀에서 검색되었는지 알아야하기 때문에. 검색된 객체는 실제로 매개 변수화 된 객체입니다 (예 : generics 포함). 각 유형은 다른 풀에 속합니다. 따라서 객체 클래스를 키로 사용하면 도움이되지 않습니다. –