জাভা চেক করা হয়নি: ভারার্গস প্যারামিটারের জন্য চেক করা জেনেরিক অ্যারে তৈরি


111

আমি আমার জাভা কোডটিতে চেক না করা সতর্কতাগুলি দেখানোর জন্য নেটবিয়ানদের সেট করেছি, তবে আমি নিম্নলিখিত লাইনে ত্রুটিটি বুঝতে ব্যর্থ হচ্ছি:

private List<String> cocNumbers;
private List<String> vatNumbers;
private List<String> ibans;
private List<String> banks;
...
List<List<String>> combinations = Utils.createCombinations(cocNumbers, vatNumbers, ibans);

দেয়:

[unchecked] unchecked generic array creation for varargs parameter of type List<String>[]

পদ্ধতির উত্স:

/**
 * Returns a list of all possible combinations of the entered array of lists.
 *
 * Example: [["A", "B"], ["0", "1", "2"]]
 * Returns: [["A", "0"], ["A", "1"], ["A", "2"], ["B", "0"], ["B", "1"], ["B", "2"]]
 *
 * @param <T> The type parameter
 * @param elements An array of lists
 * @return All possible combinations of the entered lists
 */
public static <T> List<List<T>> createCombinations(List<T>... elements) {
    List<List<T>> returnLists = new ArrayList<>();

    int[] indices = new int[elements.length];
    for (int i = 0; i < indices.length; i++) {
        indices[i] = 0;
    }

    returnLists.add(generateCombination(indices, elements));
    while (returnLists.size() < countCombinations(elements)) {
        gotoNextIndex(indices, elements);
        returnLists.add(generateCombination(indices, elements));
    }

    return returnLists;
}

ঠিক কী ঘটছে এবং আমি কীভাবে এটি সংশোধন করব, যেমন আমি মনে করি কোডটিতে চেক করা সতর্কতাগুলি ছেড়ে দেওয়া ভাল ধারণা নয়?

উল্লেখ করতে ভুলে গেছি, তবে আমি জাভা 7 ব্যবহার করছি।

সম্পাদনা : এছাড়াও আমি এখন দেখছি যে পদ্ধতিটিতে নিম্নলিখিত রয়েছে:

[unchecked] Possible heap pollution from parameterized vararg type List<T>
  where T is a type-variable:
    T extends Object declared in method <T>createCombinations(List<T>...)

17
আপনি যা যা করুন না কেন, জাভাতে আপনাকে 0 সেকেন্ড দিয়ে একটি নতুন নির্মিত ইনট অ্যারে শুরু করার দরকার নেই ...
টমাস মোলার

1
@ থমাসমিলার সেখানে ভাল ক্যাচ করেছেন
স্কিওই

উত্তর:


165

উপরে উল্লিখিত জানোহ.জানোহ হিসাবে, জাভাতে ভারার্গস অ্যারেগুলির জন্য কেবল একটি সিনট্যাকটিক চিনির সাথে সাথে কলিং সাইটে একটি অ্যারের অন্তর্নিহিত তৈরি। সুতরাং

List<List<String>> combinations =
    Utils.createCombinations(cocNumbers, vatNumbers, ibans);

এটা আসলে

List<List<String>> combinations =
    Utils.createCombinations(new List<String>[]{cocNumbers, vatNumbers, ibans});

তবে আপনি জানেন যে, new List<String>[] যে জাভাতে অনুমোদিত নয়, যে কারণে অন্যান্য অনেক প্রশ্নে আচ্ছাদিত রয়েছে, তবে মূলত এটি করা উচিত যে অ্যারেগুলি রানটাইমের সময় তাদের উপাদানগুলির ধরনটি জানে এবং রানটাইমটিতে পরীক্ষা করে দেখতে হবে যে উপাদানগুলি তার উপাদানগুলির সাথে মেলে কিনা? টাইপ করুন, তবে প্যারামিটারাইজড প্রকারের জন্য এই চেকটি সম্ভব নয়।

যাইহোক, ব্যর্থ হওয়ার পরিবর্তে, সংকলকটি এখনও অ্যারে তৈরি করে। এটি এর অনুরূপ কিছু করে:

List<List<String>> combinations =
    Utils.createCombinations((List<String>[])new List<?>[]{cocNumbers, vatNumbers, ibans});

এটি সম্ভাব্য অনিরাপদ, তবে অগত্যা নিরাপদ নয়। বেশিরভাগ ভারার্গস পদ্ধতিগুলি কেবল ভারার্গ উপাদানগুলিতে পুনরাবৃত্তি হয় এবং সেগুলি পড়তে পারে। এই ক্ষেত্রে, এটি অ্যারের রানটাইম ধরণের সম্পর্কে চিন্তা করে না। আপনার পদ্ধতির ক্ষেত্রে এটিই ঘটে। যেহেতু আপনি জাভা @SafeVarargson-তে রয়েছেন তাই আপনার পদ্ধতিতে টীকা যুক্ত করা উচিত এবং আপনি এই সতর্কতা আর পাবেন না। এই টীকাটি মূলত বলেছে, এই পদ্ধতিটি কেবল অ্যারের ধরণের নয়, উপাদানগুলির প্রকারের বিষয়ে চিন্তা করে।

যাইহোক, কিছু ভারার্গস পদ্ধতি রয়েছে যা অ্যারের রানটাইম টাইপ ব্যবহার করে। এই ক্ষেত্রে এটি সম্ভাব্য অনিরাপদ। সেই কারণেই সতর্কতা রয়েছে।


16
কেবলমাত্র SafeVarags উল্লেখ করার জন্য নয়, আমরা কখন এটি ব্যবহার করতে পারি তা বলার জন্য ধন্যবাদ।
কিটসুনওয়াইএমজি

12
যদি তা তাত্ক্ষণিকভাবে কারও কাছে সুস্পষ্ট না হয় (যেমন এটি আমার কাছে ছিল না), জাভাদোকসের @SafeVarargsএমন একটি পদ্ধতির উদাহরণ রয়েছে যা নিরাপদ ডক্স। .html
michiakig

3
সুতরাং @SafeVarargsযখন আপনার পদ্ধতিটি কেবল অ্যারের উপাদানগুলি গ্রাস করে এবং অ্যারেতে রাখার জন্য উপাদান তৈরি করে না (এবং কখনই হবে না) তখন ব্যবহার করা যেতে পারে ? যদি আপনি এমন ক্ষেত্রে এমন অ্যারে আর্গুমেন্টটি অর্পণ করেন তবে অবশ্যই বিশেষ যত্ন নেওয়া উচিত কারণ এটির দ্বারা নির্ধারিত যে কোনও অনিরাপদ অপারেশন তুচ্ছ নয় not
নেক্সাস

13

কারণ জাভা সংকলক ভারার্গসের জন্য একটি অন্তর্নিহিত অ্যারে সৃষ্টি ব্যবহার করে এবং জাভা জেনেরিক অ্যারে তৈরির অনুমতি দেয় না (কারণ টাইপ আর্গুমেন্ট পুনরায় সংশোধনযোগ্য নয়)।

নীচের কোডটি সঠিক (এই ক্রিয়াকলাপগুলি অ্যারে সহ অনুমোদিত), সুতরাং চেক না করা সতর্কতা দরকার:

public static <T> List<List<T>> createCombinations(List<T> ... lists) {
    ((Object[]) lists)[0] = new ArrayList<Integer>();
    // place your code here
}

এখানে একটি বিস্তৃত ব্যাখ্যা দেখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.