web-dev-qa-db-ja.com

javacが「未チェックまたは危険な操作を使用する」という警告を発行する原因

例えば:

javac Foo.Java
Note: Foo.Java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
262
toolbear

これは、型指定子なしでコレクションを使用している場合にJava 5以降で発生します(例:Arraylist()ではなくArrayList<String>())。つまり、 generics を使用して、コレクションが型保証された方法で使用されていることをコンパイラが確認できないということです。

警告を取り除くには、コレクションに格納しているオブジェクトの種類について具体的にしてください。だから、の代わりに

List myList = new ArrayList();

つかいます

List<String> myList = new ArrayList<String>();

Java 7では、 Type Inference を使用して一般的なインスタンス化を短縮できます。

List<String> myList = new ArrayList<>();
359
Bill the Lizard

あなたがそれが示唆することをして、そして「 - Xlint:unchecked」スイッチで再コンパイルするなら、それはあなたにもっと詳細な情報を与えるでしょう。

未処理の型の使用(他の回答で説明されているように)と同様に、未チェックのキャストも警告を引き起こす可能性があります。

-Xlintでコンパイルしたら、警告を回避するためにコードを書き直すことができるはずです。特に、変更できない従来のコードと統合している場合、これは常に可能とは限りません。このような状況では、コードが正しいことがわかっている場所で警告を抑制することにします。

@SuppressWarnings("unchecked")
public void myMethod()
{
    //...
}
180
Dan Dyer

この警告は、あなたのコードが生の型で動作していることを意味しています。

-Xlint:unchecked 

詳細を見る

このような:

javac YourFile.Java -Xlint:unchecked

Main.Java:7: warning: [unchecked] unchecked cast
        clone.mylist = (ArrayList<String>)this.mylist.clone();
                                                           ^
  required: ArrayList<String>
  found:    Object
1 warning

docs.Oracle.comはここでそれについて話しています: http://docs.Oracle.com/javase/tutorial/Java/generics/rawTypes.html

Android Studioの場合は、追加する必要があります。

allprojects {

    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:unchecked"
        }
    }

    // ...
}

プロジェクトのbuild.gradleファイルで、このエラーが発生した場所を確認してください。

11
Borzh

たとえば、Generic Collectionsを返す関数を呼び出したときに、総称パラメータを自分で指定しなかった場合です。

機能のために

List<String> getNames()


List names = obj.getNames();

このエラーが発生します。

それを解決するには、パラメータを追加するだけです。

List<String> names = obj.getNames();
5
Matt

私が正しく覚えているのであれば、Javaが Generics を追加したときに、「未チェックまたは危険な操作」という警告が追加されました。何らかの形で、型についてもっと明示的になるようにあなたに求めています。

例えば。 javacがArrayList foo = new ArrayList();を探しているので、コードArrayList<String> foo = new ArrayList<String>();はその警告を引き起こします。

5
Ryan

私がよく見かける未チェックの警告の一例を追加したいと思います。 Serializableのようなインターフェースを実装するクラスを使用する場合、実際のクラスではなく、インターフェースのオブジェクトを返すメソッドを呼び出すことがよくあります。返されるクラスを総称に基づく型にキャストする必要がある場合は、この警告を受けることがあります。

これを説明するための簡単な(そしてやや愚かな)例を示します。

import Java.io.Serializable;

public class SimpleGenericClass<T> implements Serializable {

    public Serializable getInstance() {
        return this;
    }

    // @SuppressWarnings("unchecked")
    public static void main() {

        SimpleGenericClass<String> original = new SimpleGenericClass<String>();

        //  Java: unchecked cast
        //    required: SimpleGenericClass<Java.lang.String>
        //    found:    Java.io.Serializable
        SimpleGenericClass<String> returned =
                (SimpleGenericClass<String>) original.getInstance();
    }
}

getInstance()は、Serializableを実装するオブジェクトを返します。これは実際の型にキャストする必要がありますが、これは未チェックのキャストです。

2
Michael Levy

汎用形式のままにして、次のように記述できます。

// list 2 is made generic and can store any type of Object
        ArrayList<Object> list2 = new ArrayList<Object>();

ArrayListのタイプをオブジェクトとして設定すると、あらゆるタイプのデータを保存できるという利点があります。 -Xlintなどを使用する必要はありません。

0
Mayukh Datta

解決策は<>のようにArrayList<File>で特定の型を使うことです。

例:

File curfolder = new File( "C:\\Users\\username\\Desktop");
File[] file = curfolder.listFiles();
ArrayList filename = Arrays.asList(file);

ArrayListは特定のタイプではないため、上記のコードは警告を生成します。

File curfolder = new File( "C:\\Users\\username\\Desktop");
File[] file = curfolder.listFiles();
ArrayList<File> filename = Arrays.asList(file);

上記のコードはうまくいきます。変更のみがArrayListの後の3行目にあります。

0
Julius