例えば:
javac Foo.java
Note: Foo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
これは、型指定子のないコレクションを使用している場合 (たとえば、 のArraylist()
代わりにArrayList<String>()
)、Java 5 以降で発生します。これは、ジェネリックを使用して、コレクションをタイプ セーフな方法で使用していることをコンパイラがチェックできないことを意味します。
警告を取り除くには、コレクションに格納するオブジェクトの種類を具体的に指定してください。だから、代わりに
List myList = new ArrayList();
使用する
List<String> myList = new ArrayList<String>();
Java 7 では、 Type Inferenceを使用してジェネリックのインスタンス化を短縮できます。
List<String> myList = new ArrayList<>();
それが示唆することを行い、「-Xlint:unchecked」スイッチで再コンパイルすると、より詳細な情報が得られます。
生の型の使用(他の回答で説明されているように)と同様に、チェックされていないキャストも警告を引き起こす可能性があります。
-Xlint を指定してコンパイルしたら、警告を回避するためにコードを修正できるはずです。これは常に可能であるとは限りません。特に、変更できないレガシー コードと統合している場合はそうです。この状況では、コードが正しいことがわかっている場所で警告を抑制することを決定できます。
@SuppressWarnings("unchecked")
public void myMethod()
{
//...
}
Android Studio の場合、以下を追加する必要があります。
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
}
}
// ...
}
プロジェクトの build.gradle ファイルで、このエラーが発生した場所を確認してください。
この警告は、コードが生の型で動作することを意味します。
-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
たとえば、ジェネリック コレクションを返す関数を呼び出し、ジェネリック パラメータを自分で指定しない場合などです。
関数の
List<String> getNames()
List names = obj.getNames();
このエラーが発生します。
それを解決するには、パラメータを追加するだけです
List<String> names = obj.getNames();
私の記憶が正しければ、 JavaがGenericsを追加したときに、「チェックされていない操作または安全でない操作」という警告が追加されました。通常、何らかの形で型についてより明確にするよう求めています。
例えば。ArrayList foo = new ArrayList();
javac が探しているため、コードはその警告をトリガーしますArrayList<String> foo = new ArrayList<String>();
私が頻繁に目にするチェックされていない警告の例を 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 を実装するオブジェクトを返します。これは実際の型にキャストする必要がありますが、これは未チェックのキャストです。
<>
解決策は、 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
ます。
You can keep it in the generic form and write it as:
// list 2 is made generic and can store any type of Object
ArrayList<Object> list2 = new ArrayList<Object>();
Setting type of ArrayList as Object gives us the advantage to store any type of data. You don't need to use -Xlint or anything else.