আপনি যখন ঘোষণা
public static <T> void foo(List<T>... bar)
সংকলক এটিকে রূপান্তর করে
public static <T> void foo(List<T>[] bar)
তারপরে
public static void foo(List[] bar)
বিপদটি তখন দেখা দেয় যে আপনি ভুল করে তালিকায় ভুল মান নির্ধারণ করবেন এবং সংকলক কোনও ত্রুটি ট্রিগার করবে না। উদাহরণস্বরূপ, যদি T
হয় String
তবে নিম্নলিখিত কোডটি ত্রুটি ছাড়াই সংকলন করবে তবে রানটাইমে ব্যর্থ হবে:
// First, strip away the array type (arrays allow this kind of upcasting)
Object[] objectArray = bar;
// Next, insert an element with an incorrect type into the array
objectArray[0] = Arrays.asList(new Integer(42));
// Finally, try accessing the original array. A runtime error will occur
// (ClassCastException due to a casting from Integer to String)
T firstElement = bar[0].get(0);
আপনি যদি এই ধরণের দুর্বলতা না রাখেন তা নিশ্চিত করার জন্য যদি আপনি পদ্ধতিটি পর্যালোচনা করে থাকেন তবে আপনি @SafeVarargs
সতর্কতা দমন করার জন্য এটিকে বর্নিত করতে পারেন । ইন্টারফেসের জন্য, ব্যবহার করুন @SuppressWarnings("unchecked")
।
যদি আপনি এই ত্রুটি বার্তাটি পান:
ভারার্গস পদ্ধতিটি অ-পুনঃ-সংশোধনযোগ্য ভারার্গস প্যারামিটার থেকে গাদা দূষণের কারণ হতে পারে
এবং আপনি নিশ্চিত যে আপনার ব্যবহার নিরাপদ তবে তার @SuppressWarnings("varargs")
পরিবর্তে আপনার ব্যবহার করা উচিত । দেখুন @SafeVarargs এই পদ্ধতি জন্য একটি উপযুক্ত টীকা করা হয়? এবং https://stackoverflow.com/a/14252221/14731এই দ্বিতীয় ধরণের ত্রুটির একটি সুন্দর ব্যাখ্যার জন্য ।
তথ্যসূত্র: