উত্তর:
এটি জাভা 5 এ পরে আসে এবং পরে আপনি যদি টাইপ স্পেসিফায়ার ছাড়াই সংগ্রহগুলি ব্যবহার করেন (যেমন, Arraylist()
পরিবর্তে ArrayList<String>()
)। এর অর্থ হল যে সংকলকটি জেনেরিক ব্যবহার করে আপনি সংগ্রহটি টাইপ-নিরাপদ উপায়ে ব্যবহার করছেন তা পরীক্ষা করতে পারে না ।
সতর্কতা থেকে মুক্তি পেতে, আপনি সংগ্রহে কী ধরণের জিনিস সংরক্ষণ করছেন সে সম্পর্কে সুনির্দিষ্ট করুন। সুতরাং, পরিবর্তে
List myList = new ArrayList();
ব্যবহার
List<String> myList = new ArrayList<String>();
জাভা 7 এ আপনি টাইপ ইনফারেন্স ব্যবহার করে জেনেরিক ইনস্ট্যান্টেশনটি সংক্ষিপ্ত করতে পারেন ।
List<String> myList = new ArrayList<>();
ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
new ConcurrentHashMap<>()
-Xlint:unchecked
সঙ্গে ম্যাভেন
যদি আপনি এটির পরামর্শ অনুযায়ী করেন এবং "-llint: চেক না করা" স্যুইচটি পুনরায় সংকলন করেন, এটি আপনাকে আরও বিশদ তথ্য দেবে।
কাঁচা ধরণের ব্যবহারের পাশাপাশি (অন্যান্য উত্তর দ্বারা বর্ণিত), একটি চেক না করা castালাইও সতর্কতার কারণ হতে পারে।
একবার আপনি XLint- এর সাথে কম্পাইল করে নিলে সতর্কতা এড়াতে আপনার কোডটি পুনরায় কাজ করতে সক্ষম হওয়া উচিত। এটি সর্বদা সম্ভব নয়, বিশেষত যদি আপনি লিগ্যাসি কোডের সাথে সংহত করে যা পরিবর্তন করা যায় না। এই পরিস্থিতিতে আপনি যে স্থানে কোডটি সঠিক তা জানেন যে জায়গায় সতর্কতা দমন করার সিদ্ধান্ত নিতে পারেন:
@SuppressWarnings("unchecked")
public void myMethod()
{
//...
}
অ্যান্ড্রয়েড স্টুডিওর জন্য আপনাকে যুক্ত করতে হবে:
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
}
}
// ...
}
আপনার ত্রুটিটি কোথায় উত্পাদিত হয়েছে তা জানতে আপনার প্রকল্পের বিল্ড.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"
}
}
}
আমার প্রকল্পে বিল্ড.gradle ফাইল ( বোরঝ সমাধান )
এবং তারপরে যদি কিছু মেটশেড বাকি থাকে:
@SuppressWarnings("unchecked")
public void myMethod()
{
//...
}
উদাহরণস্বরূপ, আপনি যখন এমন কোনও ফাংশন কল করেন যা জেনেরিক সংগ্রহগুলি ফেরত দেয় এবং আপনি জেনেরিক পরামিতিগুলি নিজেকে নির্দিষ্ট করেন না।
একটি ফাংশন জন্য
List<String> getNames()
List names = obj.getNames();
এই ত্রুটি উত্পন্ন করবে।
এটি সমাধান করার জন্য আপনি কেবল পরামিতি যুক্ত করবেন
List<String> names = obj.getNames();
জাভা জেনারিকস যুক্ত করার সময় জাভাগুলি যোগ করার সময় "চেক করা বা অনিরাপদ অপারেশনগুলি" সতর্কতা যুক্ত করা হয়েছিল , যদি আমি সঠিকভাবে মনে করি। এটি সাধারণত আপনাকে একরকম বা অন্য কোনও ধরণের বিষয়ে আরও স্পষ্ট থাকতে বলেছে।
উদাহরণ স্বরূপ. কোডটি ArrayList foo = new ArrayList();
সেই সতর্কবার্তাটিকে ট্রিগার করে কারণ জাভ্যাক সন্ধান করছে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>();
ধরণের অ্যারেলিস্টকে অবজেক্ট হিসাবে সেট করা আমাদের যে কোনও ধরণের ডেটা সংরক্ষণ করার সুবিধা দেয়। আপনার -Xlint বা অন্য কিছু ব্যবহার করার দরকার নেই।
এই সতর্কতা কারণে উত্থাপিত হতে পারে
নতুন হ্যাশম্যাপ () বা নতুন অ্যারেলিস্ট () যা জেনেরিক টাইপযুক্ত তা নির্দিষ্ট করে রাখতে হবে অন্যথায় সংকলক সতর্কতা উত্পন্ন করবে।
দয়া করে নিশ্চিত হয়ে নিন যে আপনার কোডটিতে নিম্নলিখিতটি থাকলে আপনার সেই অনুযায়ী পরিবর্তন করতে হবে
নতুন হ্যাশম্যাপ () => মানচিত্রের মানচিত্র = নতুন হ্যাশম্যাপ () নতুন হ্যাশম্যাপ () => মানচিত্রের মানচিত্র = নতুন হ্যাশম্যাপ <> ()
নতুন অ্যারেলিস্ট () => তালিকার মানচিত্র = নতুন অ্যারেলিস্ট () নতুন অ্যারেলিস্ট () => তালিকার মানচিত্র = নতুন অ্যারেলিস্ট <> ()
আমি 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
এবং এটি আউটপুট এ এই ইঙ্গিত দিচ্ছে