bugfix> java > 投稿

異なるタイプの例外を外部ライブラリに登録したい関数を作成しています。クラスをパラメータとして受け入れるメソッドがすでに定義されています。

構成とは異なる例外を読み取って登録したいのですが、タイプキャストの警告が表示されます。無視/抑制できますが、抑制しない方法はありますか?

正確な警告は Type safety: Unchecked cast from Class<capture#2-of ?> to Class<? extends Throwable>

警告をスローするサンプルコードは次のとおりです

Class<?> exceptionClass = Class.forName("java.lang.Exception"); //Getting this value from Config. Let us assume that config is good and I get only valid classname which extends Throwable
registerExceptionInExternalLibrary((Class<? extends Throwable>)exceptionClass); // Getting the warning here

オブジェクトがないので、ここではキャストできないと思います。しかし、キャストを使用しない場合、この警告が表示されます

The method registerExceptionInExternalLibrary(Class<? extends Throwable>) in the type XXXXX is not applicable for the arguments (Class<capture#2-of ?>)

これがそのコードサンプルです

Class<?> exceptionClass = Class.forName("java.lang.Exception"); //Getting this value from Config. Let us assume that config is good and I get only valid classname which extends Throwable
registerExceptionInExternalLibrary(exceptionClass); // Getting the warning here

回答 2 件
  • これにはClass.asSubClassを使用できます。

    Class<?> exceptionClass = Class.forName("java.lang.Exception");
    registerExceptionInExternalLibrary(exceptionClass.asSubclass(Throwable.class));
    
    

    メソッドの完全なコードは次のとおりであり、キャスト(および警告抑制)をJDKメソッドにオフロードしていることを示しているため、魔法のようなものは何もありません。しかし、それは非常に便利です map() チェーン、そしてここでもうまく機能します。また、それはあなたが正しいキャストをしていることを確認します isAssignableFrom 、これは、自分でキャストして警告を抑制した場合に書くのを忘れる追加機能です。

    @SuppressWarnings("unchecked")
    public <U> Class<? extends U> asSubclass(Class<U> clazz) {
        if (clazz.isAssignableFrom(this))
            return (Class<? extends U>) this;
        else
            throw new ClassCastException(this.toString());
    }
    
    

  • チェックされていないキャストについても同様の質問があります。

    要するに、コンパイラは、 exceptionClass タイプの変数です Class<? extends Throwable> 、とにかく警告が表示されます。

    限定されたスコープで@SuppressWarningsアノテーションを使用できます。

    @SuppressWarnings("unchecked")
    Class<? extends Throwable> exceptionClass = (Class<? extends Throwable>)Class.forName("java.lang.Exception");
    
    

    ここでの注釈は、メソッド全体には影響しません。

あなたの答え