जवाबों:
यह जावा 5 में आता है और बाद में यदि आप बिना टाइपर्स के संग्रह का उपयोग कर रहे हैं (उदाहरण के लिए, Arraylist()
इसके बजाय ArrayList<String>()
)। इसका मतलब है कि संकलक यह नहीं जांच सकता है कि आप संग्रह का उपयोग किस प्रकार से कर रहे हैं, जेनरिक का उपयोग करके ।
चेतावनी से छुटकारा पाने के लिए, बस संग्रह में आप किस प्रकार की वस्तुओं का भंडारण कर रहे हैं, इसके बारे में विशिष्ट होना चाहिए। तो, के बजाय
List myList = new ArrayList();
उपयोग
List<String> myList = new ArrayList<String>();
Java 7 में आप Type Inference का उपयोग करके सामान्य तात्कालिकता को छोटा कर सकते हैं ।
List<String> myList = new ArrayList<>();
ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
new ConcurrentHashMap<>()
-Xlint:unchecked
MAVEN के
यदि आप ऐसा करते हैं तो यह सुझाव देता है और "-Xlint: अनियंत्रित" स्विच के साथ फिर से मिलाएं, यह आपको अधिक विस्तृत जानकारी देगा।
कच्चे प्रकारों के उपयोग के साथ (जैसा कि अन्य उत्तरों द्वारा वर्णित है), एक अनियंत्रित कास्ट भी चेतावनी का कारण बन सकता है।
एक बार जब आप -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
मेरे पास 2 साल पुरानी कक्षाएं और कुछ नई कक्षाएं थीं। मैंने इसे एंड्रॉइड स्टूडियो में निम्नानुसार हल किया:
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
}
}
}
मेरी परियोजना build.gradle फ़ाइल ( Borzh समाधान ) में
और फिर अगर कुछ मेथड बचे हैं:
@SuppressWarnings("unchecked")
public void myMethod()
{
//...
}
जब जावा कहा, "अनियंत्रित या असुरक्षित संचालन" चेतावनी जोड़ा गया है जेनेरिक्स , अगर मैं सही ढंग से याद है। यह आमतौर पर आपको एक तरह से या किसी अन्य प्रकार के बारे में अधिक स्पष्ट होने के लिए कह रहा है।
उदाहरण के लिए। कोड ArrayList foo = new ArrayList();
उस चेतावनी को ट्रिगर करता है क्योंकि javac की तलाश हैArrayList<String> foo = new ArrayList<String>();
मैं बस उस तरह की अनियंत्रित चेतावनी का एक उदाहरण जोड़ना चाहता हूं जो मैं अक्सर देखता हूं। यदि आप उन कक्षाओं का उपयोग करते हैं जो एक इंटरफ़ेस को लागू करने वाले सीरियल की तरह हैं, तो अक्सर आप ऐसे तरीकों को कहेंगे जो इंटरफ़ेस की वस्तुओं को लौटाते हैं, न कि वास्तविक वर्ग को। यदि लौटाए जा रहे वर्ग को जेनेरिक के आधार पर टाइप किया जाना चाहिए, तो आपको यह चेतावनी मिल सकती है।
यहाँ एक संक्षिप्त (और कुछ मूर्खतापूर्ण) उदाहरण प्रदर्शित करने के लिए है:
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 () एक ऐसी वस्तु लौटाता है जो सीरियल योग्य बनाता है। यह वास्तविक प्रकार के लिए डाली जानी चाहिए, लेकिन यह एक अनियंत्रित डाली है।
समाधान की <>
तरह विशिष्ट प्रकार का उपयोग करना होगा 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
।
आप इसे सामान्य रूप में रख सकते हैं और इसे इस प्रकार लिख सकते हैं:
// list 2 is made generic and can store any type of Object
ArrayList<Object> list2 = new ArrayList<Object>();
ऑब्जेक्ट के रूप में ArrayList का प्रकार सेट करना हमें किसी भी प्रकार के डेटा को संग्रहीत करने का लाभ देता है। आपको -Xlint या किसी और चीज़ का उपयोग करने की आवश्यकता नहीं है।
इस चेतावनी के कारण भी उठाया जा सकता है
नया HashMap () या नया ArrayList () जो सामान्य प्रकार है विशिष्ट होना चाहिए अन्यथा संकलक चेतावनी उत्पन्न करेगा।
कृपया सुनिश्चित करें कि यदि आपके पास कोड शामिल है तो आपको उसके अनुसार बदलना होगा
new HashMap () => मैप मैप = नया HashMap () नया HashMap () => मैप मैप = नया HashMap <> ()
नया ArrayList () => सूची मानचित्र = नया ArrayList () नया ArrayList () => सूची मानचित्र = नया ArrayList <> ()
मेरे पास है ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;
। क्योंकि value
एक जटिल संरचना है (मैं JSON को साफ करना चाहता हूं ), संख्या, बूलियन, स्ट्रिंग्स, सरणियों पर कोई भी संयोजन हो सकता है। इसलिए, मैंने @ डायर के समाधान का उपयोग किया:
@SuppressWarnings("unchecked")
ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;
sun.misc.Unsafe
और यह आउटपुट पर ये संकेत दे रहा है