h-kouji
@h-kouji (浩二郎 平田)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Java @SuppressWarnings("rawtypes")をメソッド宣言のみに適用したい

Q&A

解決したいこと

Javaの@SuppressWarnings("rawtypes")を使用して、メソッド宣言のみの警告を抑制したいです。
具体的には以下の例のように、メソッド宣言の戻り値の型とメソッド内部でListのジェネリクス未指定のコードがあり、メソッド宣言の戻り値の型のみに警告抑制を適用したいです。
しかし、戻り値の型に適用しようと、メソッド宣言の上部に@SuppressWarnings("rawtypes")を付与すると、メソッド全体の警告が抑制されてしまいます。

例)

以下の1行目 / 2行目でジェネリクス未指定の警告が発生。

    private List method() {
    	List list = new ArrayList<>();
    	return list;
    }

1行目の警告を抑制するためにメソッド宣言上部に、@SuppressWarnings("rawtypes")を付与すると、
2行目の警告まで抑制されてしまう。

    @SuppressWarnings("rawtypes")
    private List method() {
    	List list = new ArrayList<>();
    	return list;
    }

警告抑制自体を考え直さないといけないことは承知していますが、どうしても抑制しないといけない画面に出くわしているため、質問させていただきました。

よろしくお願いします。

0

1Answer

Comments

  1. @h-kouji

    Questioner

    コメントありがとうございます!

    ジェネリクスにワイルドカード指定 / Object等、一通り試しましたが、メソッドの呼び出し元の記載方法が原因で警告を消せない状況です。
    そのため@SuppressWarningsで抑制したいと考えております。

  2. 伝わってるのでしょうか?

    $ cat hoge.sh 
    cat >Main.java <<EOF
    import java.util.*;
    public class Main {
        private List<?> method() {
            List list = new ArrayList<>();
            return list;
        }
        public static void main(String[] args) {
            new Main().method();
        }
    }
    EOF
    javac --version
    javac -Xlint Main.java
    $ sh hoge.sh
    javac 19.0.2
    Main.java:4: 警告:[rawtypes] raw型が見つかりました: List
            List list = new ArrayList<>();
            ^
      汎用クラスList<E>の型引数がありません
      Eが型変数の場合:
        インタフェース Listで宣言されているE extends Object
    警告1個
    $
    
  3. @h-kouji

    Questioner

    ありがとうございます。
    いただいた例のようなイメージはついています。

    ただ、List>とすると、メソッドの呼び出し元と矛盾が発生する状況です。
    そのため、警告を消すのではなく、抑制する方向で考えており、質問させていただきました。

    警告を消す方法は、ソースコードを書き換えればできるのですが、プロジェクトの方針上、消すのが難しい状況です。

  4. List(rawtype)とList<?>(wildcard)は確かに違いますが、それならメソッド分ければいいのでは?

    import java.util.*;
    public class Main {
        private List<?> privateMethod() {
            List list = new ArrayList<>();
            return list;
        }
        @SuppressWarnings("rawtypes")
        public List method() {
            return this.privateMethod();
        }
        public static void main(String[] args) {
            new Main().method();
        }
    }
    

Your answer might help someone💌