javacが「チェックされていない、または安全でない操作を使用しています」という警告を発行する原因


291

例えば:

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

私は動的に使用sun.misc.Unsafeしていくつかのクラスを作成しており、出力でこれらのヒントを提供しています
DavutGürbüzApr

回答:


392

これは、型指定子なしのコレクションを使用している場合(たとえば、のArraylist()代わりArrayList<String>())、Java 5以降で発生します。これは、ジェネリックを使用して、タイプセーフな方法でコレクションを使用していることをコンパイラが確認できないことを意味します。

警告を取り除くには、コレクションに格納しているオブジェクトのタイプを具体的に指定してください。したがって、代わりに

List myList = new ArrayList();

使用する

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

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

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

Javaの7には、私も使って同じ警告を得たタイプの干渉をこのコレクションで:ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
ルシオ

13
@Lucio山かっこが必要です。new ConcurrentHashMap<>()
トカゲに請求する14年

3
指摘しておきますが、これはコレクション固有ではありません。一般に、Javaコンパイラーは型の安全性を保証できないため、エラーが発生します。たとえば、同じ警告が次のコードで生成されます。AbstractMap.SimpleEntry<String、String>
14

1
-Xlint:uncheckedMAVEN
vanduc1102

200

「-Xlint:unchecked」スイッチを使用してそれが示唆することを行い、再コンパイルすると、より詳細な情報が得られます。

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

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

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

12
もっと多くの人がこの答えに賛成してくれるといいのですが。私は@Bill the Lizardの回答の選択を待機していますが、この回答は、回答が警告自体の中で真っ直ぐに私を見つめていたことと、エラーが発生した別の理由を詳しく説明していることを示してくれました。
toolbear 2011

1
これが究極の答えです!
russellhoff

この答えは解決策としてマークされているはずです!ありがとう!
アレクサンダーマリギン

19

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

allprojects {

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

    // ...
}

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


おかげで、私はこれを追加することで私の警告の
出所を

この警告が表示され、ASはそれが生成されたクラスを示します。これはエラーではなく、警告です。なぜこのオプションを追加する必要があるのですか?あなたの状況で問題のあるクラスは示されていませんか?
CoolMind

笑、私は質問に答えるだけで、いいえ、これを追加するまで問題は表示されません。
ボルジ

16

この警告は、コードがraw型で動作することを意味します。

-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


1
そうだと思います。この正確な警告については、Oracleのドキュメントにリンクしています。
Nick Westgate、2014

6

2歳のクラスといくつかの新しいクラスがありました。私は次のようにAndroid Studioでそれを解決しました:

allprojects {

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

}

私のプロジェクトでbuild.gradleファイル(Borzhソリューション

そして、いくつかのメセズが残っている場合:

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

5

たとえば、ジェネリックコレクションを返す関数を呼び出し、ジェネリックパラメーターを自分で指定しない場合などです。

機能のために

List<String> getNames()


List names = obj.getNames();

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

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

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

5

私が正しく覚えていれば、javaがGenericsを追加したときに、「未チェックまたは安全でない操作」の警告が追加されました。それは通常、何らかの方法で型についてより明示的になるように求めています。

例えば。ArrayList foo = new ArrayList();javacが探しているため、コードはその警告をトリガーしますArrayList<String> foo = new ArrayList<String>();


2

私がよく目にする未チェックの警告の例を1つだけ追加します。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を実装するオブジェクトを返します。これは実際の型にキャストする必要がありますが、これはチェックされていないキャストです。


0

解決策は、特定のタイプを<>likeで使用すること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);

上記のコードで問題ありません。変更のみがの後の3行目にありArrayListます。


0

あなたはそれを一般的な形に保ち、次のように書くことができます:

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

ArrayListのタイプをObjectとして設定すると、あらゆるタイプのデータを格納できるという利点があります。-Xlintなどを使用する必要はありません。


0

この警告は、

ジェネリック型である新しいHashMap()または新しいArrayList()は特定である必要があります。そうでない場合、コンパイラは警告を生成します。

コードに以下が含まれている場合は、それに応じて変更する必要があることを確認してください

new HashMap()=>マップマップ= new HashMap()new HashMap()=>マップマップ= new HashMap <>()

new ArrayList()=>リストマップ= new ArrayList()new ArrayList()=>リストマップ= new ArrayList <>()


0

持っていArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;ます。のでvalue(私がしたい複雑な構造であるクリーンなJSON)、数字、ブール値、文字列、配列上の任意の組み合わせが発生する可能性があります。そこで、@ Dan Dyerのソリューションを使用しました。

@SuppressWarnings("unchecked")
ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.