2016-08-08 5 views
1

私は次のセットアップがあります未確認のキャストの警告時にクラスに基づくリターン一般的な実装<>引数

@Override 
public <T> Optional<EndpointProvider<T>> getProvider(Class<T> providedClass) { 
    if(providedClass.isAssignableFrom(RecommendationCategory.class)){ 
     return Optional.of((EndpointProvider<T>) new RecommendationCategoryProvider()); 
    } 
    return Optional.empty(); 
} 

private class RecommendationCategoryProvider implements EndpointProvider<RecommendationCategory> { 

をし、コンパイラは私に未チェックのキャストの警告を与えています。私は、provideClass.isAssignableFrom(RecommendationCategory.class)をチェックすると、チェックされていないキャストの警告を防ぐことができると思います。

この設定でこの警告を表示しない方法はありますか?

+3

時には、コンパイラは警告が表示されます。警告が表示されていれば、よりよく分かります。完璧な世界では、あなたの頭(または開発時間)を失うことは何もありません。 しかし、この場合、基本クラスに対してコンポーネントのタイプを確認する必要があると思います。あなたがすでにそれをやっているなら、この場合はコンパイラよりもスマートです。 – Rogue

+1

警告を無視するようにコンパイラに指示するには、[@ SuedressWarnings( "unchecked")](https://docs.oracle.com/javase/8/docs/api/java/lang/SuppressWarnings.html)を使用します。 – McDowell

答えて

1

これが私がそれを行うための唯一の方法です。警告は表示されません。

public static <T> EndpointProvider<T> getProvider(Class<T> klass) 
{ 
    if (klass.isAssignableFrom(RecommendationCategory.class)) 
    { 
     return new EndpointWrapper<T>(klass.cast(new RecommendationCategory())); 
    } 

    return null; 
} 

private static class EndpointWrapper<X> implements EndpointProvider<X> 
{ 
    public EndpointWrapper(X wrapper) 
    { 

    } 
} 

private static class RecommendationCategory 
{ 

} 

private static interface EndpointProvider<T> 
{ 

} 
+0

私はそれをEndpointProvider にキャストする必要があります。だから私はこれを行うことはできません。 –

+0

答えを編集しました - 実行時に安全にジェネリックをチェックする方法はありません。 –

+0

こんにちは、編集のおかげで、この場合はまだ適用されません。私はisAssignableFromをチェックする必要があります。なぜなら、それが割り当て可能でない場合、私はOptional.emptyを返す必要があるからです。そして、プロダクションコードには、他のクラスのプロバイダのためのelse文があればもっとたくさんあります。 –

関連する問題