Yanıtlar:
Bu, tür belirticileri olmayan koleksiyonları (örneğin, Arraylist()
yerine ArrayList<String>()
) kullanıyorsanız Java 5 ve sonraki sürümlerde ortaya çıkar . Bu, derleyicinin koleksiyonu jenerikler kullanarak tür güvenli bir şekilde kullandığınızı kontrol edemeyeceği anlamına gelir .
Uyarıdan kurtulmak için koleksiyonda ne tür nesneler sakladığınız konusunda net olun. Yani, yerine
List myList = new ArrayList();
kullanım
List<String> myList = new ArrayList<String>();
Java 7'de Yazım Çıkarımını kullanarak genel örneklemeyi kısaltabilirsiniz .
List<String> myList = new ArrayList<>();
ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
new ConcurrentHashMap<>()
-Xlint:unchecked
ile MAVEN
Önerisini yapar ve "-Xlint: unchecked" anahtarıyla yeniden derlerseniz, size daha ayrıntılı bilgi verir.
Ham türlerin kullanımının yanı sıra (diğer cevaplarda açıklandığı gibi), kontrol edilmemiş bir döküm de uyarıya neden olabilir.
-Xlint ile derledikten sonra, uyarıyı önlemek için kodunuzu yeniden çalışabilmeniz gerekir. Bu her zaman mümkün değildir, özellikle değiştirilemeyen eski kodlarla entegre ediyorsanız. Bu durumda, kodun doğru olduğunu bildiğiniz yerlerde uyarıyı bastırmaya karar verebilirsiniz:
@SuppressWarnings("unchecked")
public void myMethod()
{
//...
}
Android Studio için şunları eklemeniz gerekir:
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
}
}
// ...
}
projenizin build.gradle dosyasında bu hatanın nerede üretildiğini bilmek.
Bu uyarı, kodunuzun ham türde çalıştığı, örneği
-Xlint:unchecked
detayları almak için
bunun gibi:
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 buradan bahsediyor: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html
2 yaşında derslerim ve yeni derslerim vardı. Android Studio'da şu şekilde çözdüm:
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
}
}
}
Projemde build.gradle dosyası ( Borzh çözümü )
Ve sonra bazı Metheds kaldıysa:
@SuppressWarnings("unchecked")
public void myMethod()
{
//...
}
örneğin, Genel Koleksiyonlar döndüren bir işlevi çağırdığınızda ve genel parametreleri kendiniz belirtmediğinizde.
bir işlev için
List<String> getNames()
List names = obj.getNames();
bu hatayı oluşturur.
Bunu çözmek için sadece parametreleri eklersiniz
List<String> names = obj.getNames();
Java, Generics eklediğinde , doğru şekilde hatırlamıyorsam "denetlenmeyen veya güvenli olmayan işlemler" uyarısı eklendi . Genellikle türler hakkında bir şekilde daha açık olmanızı ister.
Örneğin. ArrayList foo = new ArrayList();
javac aradığı için kod bu uyarıyı tetiklerArrayList<String> foo = new ArrayList<String>();
Sadece sık sık gördüğüm kontrolsüz uyarı türüne bir örnek eklemek istiyorum. Serializable gibi bir arabirim uygulayan sınıflar kullanıyorsanız, genellikle gerçek sınıfı değil, arabirimin nesnelerini döndüren yöntemleri çağırırsınız. Döndürülen sınıfın jeneriklere dayalı bir türe verilmesi gerekiyorsa, bu uyarıyı alabilirsiniz.
Göstermek için kısa (ve biraz saçma) bir örnek:
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 uygulayan bir nesne döndürür. Bu, gerçek türe dönüştürülmelidir, ancak bu işaretlenmemiş bir dökümdür.
Solüsyon belirli tip kullanmak olacaktır <>
gibi ArrayList<File>
.
misal:
File curfolder = new File( "C:\\Users\\username\\Desktop");
File[] file = curfolder.listFiles();
ArrayList filename = Arrays.asList(file);
Yukarıdaki kod ArrayList
belirli türde olmadığından uyarı oluşturur .
File curfolder = new File( "C:\\Users\\username\\Desktop");
File[] file = curfolder.listFiles();
ArrayList<File> filename = Arrays.asList(file);
Yukarıdaki kod iyi olacak. Yalnızca değişiklik sonraki üçüncü satırda olur ArrayList
.
Genel formda tutabilir ve şu şekilde yazabilirsiniz:
// list 2 is made generic and can store any type of Object
ArrayList<Object> list2 = new ArrayList<Object>();
ArrayList türünün Nesne olarak ayarlanması bize her türlü veriyi depolama avantajı sağlar. -Xlint ya da başka bir şey kullanmanıza gerek yoktur.
Bu uyarı ayrıca
yeni HashMap () veya genel tür olan yeni ArrayList () özel olmalıdır, aksi takdirde derleyici uyarı oluşturur.
Lütfen aşağıdakileri kodlarsanız buna göre değiştirmeniz gerektiğinden emin olun
yeni HashMap () => Harita haritası = yeni HashMap () yeni HashMap () => Harita haritası = yeni HashMap <> ()
new ArrayList () => Liste haritası = yeni ArrayList () new ArrayList () => Liste haritası = yeni ArrayList <> ()
Ben var ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;
. Çünkü value
karmaşık bir yapı (I istediğim temiz JSON ), sayılar, Boolean, dizeleri, diziler üzerinde herhangi kombinasyonları var olabilir. Bu yüzden @ Dan Dyer'ın çözümünü kullandım:
@SuppressWarnings("unchecked")
ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;
sun.misc.Unsafe
ve çıktıda bu ipuçlarını veriyor