2016-11-15 6 views
0

openJPA (조금 오래된 버전 1.2)를 사용하고 있는데, 내가 캐스팅 할 때마다 경고 메시지가 나타납니다. query.getResultList().안전하지 않은 타입 : Foo에서 Bar 로의 체크되지 않은 캐스트. JPA stuff

다음
// @SuppressWarnings("unchecked") I DON'T WANT TO DO THIS HERE 
public <T> List<T> findByQuery(String queryString) { 
    myEntityManager.createQuery(queryString); 
    @SuppressWarnings("unchecked") // I WANT TO DO IT HERE 
    return (List<T>)query.getResultList(); 
} 

내가 할 수있는 :

을 나는 그래서 특정 경고 제거 할 수 이전 라인에 @SuppressWarnings("unchecked")를 사용하지만 다음 예제와 같이 목록을 반환해야 할 때 나는 동일한 기능을 수행 할 수 없습니다
... 
    @SuppressWarnings("unchecked") 
    List<T> result = query.getResultList(); 
    return result; 
} 

그러나 sonar은 목록에 변수를 저장하지 말고 바로 반환해야한다고 불평합니다. 내 최고의 옵션은 무엇입니까?

+0

첫 번째 스 니펫에 값을 지정하지 않고 메서드에서 값을 반환 할 때 @SuppressWarnings을 메서드 자체에 추가해야합니다. 당신은 "나 여기 이걸하고 싶지 않다"라는 소나 위반이나 첫 번째 코드 스 니펫으로 살아야만한다. –

+0

소나기를 속일 때 더러운 해결책이있다. (나는 이것을하는 것을 권장하지 않지만). "result.size();"를 추가하십시오. 결과를 반환하기 전에 소나 위반을 제거하십시오. 메서드 수준에서 주석이있는 첫 번째 스 니펫에 고정하는 것이 좋습니다. –

+0

Checkstyle을 사용하지 않습니까? checkstyle 오류를 비활성화 할 수 있습니다. –

답변

0

query.getResultList()List<Object>을 반환합니다. 당신은 List<T>로 캐스트하지 않을 것이지만 자바는 정의 할 수 없다는 것을 정의 할 수 없습니다 - 타입 소거로 인해 런타임시 차이가 없습니다. 그래서 @SuppressWarnings("unchecked")을 사용해야합니다.

새로운 기능에서 모든 개체를 원하는 형식으로 캐스팅하는 간단한 해결책이 있습니다. 이렇게하려면, 당신이 할 일은 지금 어떤 클래스입니다 - 그래서 : 새로운 List<T>

에서

그냥 간단한 루프 맵 기능을 변경 자바의 이전 버전에서 자바 8

public <T> List<T> findByQuery(String queryString, Class<T> clazz) { 
    myEntityManager.createQuery(queryString); 
    return query 
      .getResultList() 
      .stream() 
      .map(result -> clazz.cast(result)) 
      .collect(Collectors.toList()); 
} 

에서

이 주조 퍼팅 결과

+0

.map(). collect를 사용하면 새로운 배열이 생성됩니까? – nacho4d

+0

'.collect (Collectors.toList())'는 매핑 결과와 함께'List '를 반환합니다. 그것은 어떤 종류의'reduce()'메소드로 생각하십시오 –

+0

예 ... 저는 그렇게 생각했습니다. 나는 단지 던지고 싶다. 경고를 없애기 위해 새로운 배열을 생성해야한다면 메서드 수준에서 @SuppressWarnings ("확인되지 않음")을 선호해야한다고 생각합니다. – nacho4d