2016-11-15 2 views
0

私はopenJPA(ちょっと古いバージョン1.2)を使用していて、私がquery.getResultList()をキャストするたびに警告を受け取ります。私はその特定の警告を取り除くことができますが、私は次の例のようにリストを返す必要があるとき、私は同じことを行うことができないので、私は前の行に@SuppressWarnings("unchecked")を使用します。タイプunsafety:FooからBarへのチェックされていないキャスト。 JPAのもの

// @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") 
    List<T> result = query.getResultList(); 
    return result; 
} 

ですが、sonarはリストを変数に格納してはいけませんが、すぐにそれを返すべきだと不平を言います。ここで私の最高のオプションは何ですか?

+0

メソッドの値を最初のスニペットで割り当てずに返すので、メソッド自体に@SuppressWarningsを追加する必要があります。あなたはソナーの違反または最初のコードスニペットのどちらかで生きなければなりません "私はここにこれをしたくありません" –

+0

ソナーの周りをばかにするだけで、汚い解決策もあります。 "result.size();"を追加します。ソナーの違反を取り除くために結果を返す前に。メソッドレベルでアノテーションを付けて1番目のスニペットに固執することをおすすめします。 –

+0

Checkstyleをソナーで使用していませんか? checkstyleエラーを無効にすることができます。 –

答えて

0

query.getResultList()返信List<Object>です。あなたはそれをList<T>にキャストすることを望んでいませんが、javaはそれが可能かどうかを定義することはできません - タイプの消去のために実行時に違いはありません。そのため、@SuppressWarnings("unchecked")を使用する必要があります。

これを取り除くには、単純な解決策が1つあります。すべてのオブジェクトを新しい関数に必要な型にキャストします。これを行うには、あなたはそれがあるに今何クラス持っている - そうします。javaの古いバージョンでは

Javaで
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()); 
} 

あなただけの新しいList<T>

にキャストした結果を置く単純なループにマップ機能を変更します
+0

.map()。collectは新しい配列を作成するでしょうか? – nacho4d

+0

'.collect(Collectors.toList())'はマップされた結果とともに 'List 'を返します。何らかの 'reduce()'メソッドと考えてください –

+0

ええと...私はそれを考えました。私はただキャストしたい。警告を取り除くために新しい配列を作成する必要がある場合は、メソッドレベルで@SuppressWarnings( "未チェック")を優先すべきだと思います。 – nacho4d

関連する問題