回答:
これは、型指定子なしのコレクションを使用している場合(たとえば、のArraylist()
代わりArrayList<String>()
)、Java 5以降で発生します。これは、ジェネリックを使用して、タイプセーフな方法でコレクションを使用していることをコンパイラが確認できないことを意味します。
警告を取り除くには、コレクションに格納しているオブジェクトのタイプを具体的に指定してください。したがって、代わりに
List myList = new ArrayList();
使用する
List<String> myList = new ArrayList<String>();
Java 7では、型推論を使用して一般的なインスタンス化を短縮できます。
List<String> myList = new ArrayList<>();
ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
new ConcurrentHashMap<>()
-Xlint:unchecked
MAVEN
「-Xlint:unchecked」スイッチを使用してそれが示唆することを行い、再コンパイルすると、より詳細な情報が得られます。
(他の回答で説明されているように)rawタイプの使用と同様に、チェックされていないキャストも警告を引き起こす可能性があります。
-Xlintを使用してコンパイルすると、警告を回避するためにコードを書き直すことができるはずです。これは常に可能であるとは限りません。特に、変更できないレガシーコードと統合する場合はそうです。この状況では、コードが正しいことがわかっている場所で警告を抑制するように決定できます。
@SuppressWarnings("unchecked")
public void myMethod()
{
//...
}
Android Studioの場合、以下を追加する必要があります。
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
}
}
// ...
}
プロジェクトのbuild.gradleファイルで、このエラーが発生した場所を確認します。
この警告は、コードが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
2歳のクラスといくつかの新しいクラスがありました。私は次のようにAndroid Studioでそれを解決しました:
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
}
}
}
私のプロジェクトでbuild.gradleファイル(Borzhソリューション)
そして、いくつかのメセズが残っている場合:
@SuppressWarnings("unchecked")
public void myMethod()
{
//...
}
私がよく目にする未チェックの警告の例を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
ます。
この警告は、
ジェネリック型である新しいHashMap()または新しいArrayList()は特定である必要があります。そうでない場合、コンパイラは警告を生成します。
コードに以下が含まれている場合は、それに応じて変更する必要があることを確認してください
new HashMap()=>マップマップ= new HashMap()new HashMap()=>マップマップ= new HashMap <>()
new ArrayList()=>リストマップ= new ArrayList()new ArrayList()=>リストマップ= new ArrayList <>()
持ってい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;
sun.misc.Unsafe
していくつかのクラスを作成しており、出力でこれらのヒントを提供しています