আমি কীভাবে চেক না করা castালাইয়ের সতর্কতাগুলি সম্বোধন করব?


610

গ্রহণ আমাকে নীচের ফর্মটির একটি সতর্কতা দিচ্ছে:

সুরক্ষা প্রকার: অবজেক্ট থেকে হ্যাশম্যাপে চেক করা কাস্ট

এটি এমন একটি এপিআই-এর কল থেকে যে আমার কোন নিয়ন্ত্রণ নেই যা কোন বস্তুটি দেয়:

HashMap<String, String> getItems(javax.servlet.http.HttpSession session) {
  HashMap<String, String> theHash = (HashMap<String, String>)session.getAttribute("attributeKey");
  return theHash;
}

তাত্ত্বিকভাবে তারা কমপক্ষে একটি সম্ভাব্য কোড সমস্যা নির্দেশ করে বলে আমি যদি সম্ভব হয় তবে গ্রহগ্রহের সতর্কতাগুলি এড়াতে চাই। যদিও এটিকে নির্মূল করার জন্য আমি এখনও কোনও ভাল উপায় খুঁজে পাইনি। আমি নিজেই কোনও পদ্ধতির সাথে জড়িত একক লাইনটি বের করতে পারি এবং @SuppressWarnings("unchecked")সেই পদ্ধতিতে যুক্ত করতে পারি, এইভাবে কোডের ব্লক থাকার প্রভাব সীমাবদ্ধ করে যেখানে আমি সতর্কতাগুলি উপেক্ষা করি। আরও ভাল বিকল্প? আমি এই সতর্কতাগুলি গ্রহণ করতে চাই না Eclipse এ।

আমি কোডে আসার আগে এটি সহজ ছিল, তবে তবুও সতর্কতাগুলি উস্কে দিয়েছে:

HashMap getItems(javax.servlet.http.HttpSession session) {
  HashMap theHash = (HashMap)session.getAttribute("attributeKey");
  return theHash;
}

আপনি হ্যাশ ব্যবহার করার চেষ্টা করার সময় সমস্যাটি অন্য কোথাও ছিল আপনি সতর্কতা পেতে চেয়েছিলেন:

HashMap items = getItems(session);
items.put("this", "that");

Type safety: The method put(Object, Object) belongs to the raw type HashMap.  References to generic type HashMap<K,V> should be parameterized.

আপনি যদি এটির মতো এইচটিটিপিএসশন ব্যবহার করে থাকেন তবে ব্রায়ান গয়েটজের
টম হাটিন -

যদি একটি চেক না করা castালাই অনিবার্য না হয় তবে একটি ভাল ধারণাটি একে যুক্তিযুক্তভাবে এটি টাইপ করে এমন কিছু (যা একটি enumবা এমনকি উদাহরণস্বরূপ Class<T>) উপস্থাপন করে তার সাথে দৃ couple়ভাবে জুটি করা হয় , যাতে আপনি এটি তাকান এবং এটি নিরাপদ জানতে পারেন।
ফিলিপ গিন



আমি যোগ করব, আমি পেয়েছি যে কেবলমাত্র অফিশনীয় কোড রয়েছে এমন পদ্ধতিতে আমি কেবলমাত্র @ সপ্রেস ওয়ার্নিংস ("চেক না করা") যুক্ত করতে পারি। সুতরাং আমি কোডটি একটি নিয়মিত করতে পেরেছিলাম যেখানে আমাকে এটি করতে হয়েছিল। আমি সবসময় ভেবেছিলাম যে আপনি প্রশ্নযুক্ত লাইনের সাথে সাথেই এটি করতে পারবেন।
জেজিএফএমকে

উত্তর:


557

অবশ্যই এর স্পষ্ট উত্তরটি চেক না করা castালাই না করা।

যদি এটি একেবারে প্রয়োজনীয় হয়, তবে কমপক্ষে @SuppressWarningsএনটোটেশনের সুযোগটি সীমাবদ্ধ করার চেষ্টা করুন । জাভাডোকস অনুসারে , এটি স্থানীয় ভেরিয়েবলগুলিতে যেতে পারে; এইভাবে, এটি এমনকি পুরো পদ্ধতিকেও প্রভাবিত করে না।

উদাহরণ:

@SuppressWarnings("unchecked")
Map<String, String> myMap = (Map<String, String>) deserializeMap();

Mapসত্যই জেনেরিক পরামিতি থাকা উচিত কিনা তা নির্ধারণের কোনও উপায় নেই <String, String>। প্যারামিটারগুলি কী হওয়া উচিত তা আপনাকে আগেই জেনে রাখা উচিত (বা আপনি যখন এটি পাবেন তখন আপনি তা খুঁজে পাবেন ClassCastException)। এজন্য কোডটি একটি সতর্কতা উত্পন্ন করে, কারণ সংকলক সম্ভবত নিরাপদ কিনা তা জানতে পারে না।


112
এটি স্থানীয় ভেরিয়েবলগুলিতে যেতে পারে তা নির্দেশ করার জন্য +1।
গ্রহণটি

17
Eclipse 3.7 (ইন্ডিগো) এর স্থানীয় ভেরিয়েবলগুলিতে চেক করা ছাড়ার জন্য সমর্থন রয়েছে has
মিষ্টিফা

78
সতর্কতা কেবল কারণ নয় যে সংকলক জানেন না যে কাস্ট নিরাপদ safe উদাহরণস্বরূপ String s = (String) new Object() ;কোনও সতর্কতা পাওয়া যায় না, যদিও সংকলকটি জানেন না যে কাস্টটি নিরাপদ। সতর্কতাটি হ'ল কারণ সংকলক (ক) জানেন না যে কাস্ট নিরাপদ আছে এবং (খ) castালাইয়ের বিন্দুতে একটি সম্পূর্ণ রান-টাইম চেক তৈরি করবে না। এটি একটি যাচাই করা হবে Hashmap, তবে এটি যে এটি একটি চেক থাকবে না HashMap<String,String>
থিওডোর নরভেল

9
দুঃখের বিষয়, যদিও কাস্ট এবং সতর্কতা অ্যাসাইনমেন্টের জন্য হলেও , টীকাগুলিকে পরিবর্তনশীল ঘোষণার উপর যেতে হবে ... সুতরাং যদি ঘোষণা এবং অ্যাসাইনমেন্টটি বিভিন্ন জায়গায় থাকে (যথাক্রমে একটি 'চেষ্টা' ব্লকের ভিতরে এবং বলুন) , Eclipse এখন দুটি সতর্কতা উত্পন্ন করে: মূল চেক না করা কাস্ট এবং একটি নতুন "অপ্রয়োজনীয় টীকা" ডায়াগনস্টিক।
তি স্টারগা

6
স্থানীয় পরিবর্তনশীল ঘোষণাপত্রের সাথে টিকাশনের প্রয়োজনীয়তা, যা প্রকৃত castালাইয়ের চেয়ে আলাদা লাইনে আলাদা স্কোপ হতে পারে, বিশেষভাবে একই লাইনে castালাই সঞ্চালনের জন্য কাস্টের আওতার মধ্যে একটি স্থানীয় ভেরিয়েবল তৈরি করা is ঘোষণা হিসাবে। তারপরে এই ভেরিয়েবলটিকে আসল ভেরিয়েবলের জন্য নির্ধারণ করুন যা একটি ভিন্ন স্কোপে রয়েছে। টীকাগুলির জন্য উদাহরণের পরিবর্তে কোনও কাস্টের উপর সতর্কতা দমন করতে আমি এই পদ্ধতিটি ব্যবহার করলাম কারণ এখানে টীকাটি প্রয়োগ করা যায় না।
জেফ লকহার্ট

167

দুর্ভাগ্যক্রমে, এখানে দুর্দান্ত কোনও বিকল্প নেই। মনে রাখবেন, এই সমস্তটির লক্ষ্য হ'ল ধরণের সুরক্ষা রক্ষা করা। " জাভা জেনারিক্স " জেনারিকাইজড লিগ্যাসি গ্রন্থাগারগুলির সাথে ডিল করার জন্য একটি সমাধান সরবরাহ করে এবং বিভাগ 8.2 এর "খালি লুপ কৌশল" নামে একটি বিশেষত রয়েছে। মূলত, অনিরাপদ নিক্ষিপ্ত করুন এবং সতর্কতা দমন করুন। তারপরে মানচিত্রের মধ্য দিয়ে লুপ করুন:

@SuppressWarnings("unchecked")
Map<String, Number> map = getMap();
for (String s : map.keySet());
for (Number n : map.values());

যদি কোনও অপ্রত্যাশিত ধরণের মুখোমুখি হয় তবে আপনি রানটাইম পাবেন ClassCastExceptionতবে অন্তত এটি সমস্যার উত্সের কাছাকাছি ঘটবে।


6
একাধিক কারণে স্কিপোপ্পি সরবরাহিত জবাবের চেয়ে অনেক বেশি ভাল উত্তর: ১) এই কোডটি অনেক বেশি, আরও খাটো। 2) এই কোডটি আসলে প্রত্যাশার মতো ক্লাসকাস্টএক্সসেপশন ছুড়ে দেয়। 3) এই কোডটি উত্স মানচিত্রের একটি সম্পূর্ণ অনুলিপি করে না। 4) লুপগুলি সহজেই একটি দৃsert়ভাবে ব্যবহৃত পৃথক পদ্ধতিতে মোড়ানো যায়, যা উত্পাদন কোডে পারফরম্যান্সের হিটটি সহজেই সরিয়ে ফেলবে।
স্টিজন ডি উইট

6
জাভা সংকলক বা জেআইটি সংকলক সিদ্ধান্ত নেবেন যে এই কোডের ফলাফলগুলি ব্যবহার হচ্ছে না এবং সংকলন না করে এটিকে "অনুকূলিতকরণ" করার কোনও সম্ভাবনা নেই?
রেনিপেট

1
এটি সম্ভবত ডেড কোড নয় যদি এটি সম্ভাব্যভাবে কোনও ব্যতিক্রম ছুঁড়ে ফেলতে পারে। আমি আজ জেআইটি সংস্থাগুলি সম্পর্কে গ্যারান্টি হিসাবে যথেষ্ট জানি না যে তাদের মধ্যে কেউই এই গোলমাল করবে না, তবে আমি বলার ক্ষেত্রে যথেষ্ট আত্মবিশ্বাসী বোধ করছি যে তাদের ধারণা করা হয়নি।
গ্র্যান্ডআপনার

3
একই মানচিত্রটি এখনও ব্যবহৃত হচ্ছে বলে এটি এখনও ধরণের সুরক্ষার গ্যারান্টি দেয় না। এটি সম্ভবত ম্যাপ <অবজেক্ট, অবজেক্ট> হিসাবে সংজ্ঞায়িত করা হয়েছিল যে স্ট্রিংস এবং নম্বরগুলি কেবল তখনই ঘটে এবং পরে যদি কোনও বুলিয়ান যুক্ত হয় তবে এই কোডটির ব্যবহারকারীর বিভ্রান্তিকর এবং বিস্ময়কর চিহ্নটি পাওয়া শক্ত হয়ে যাবে। ধরণের সুরক্ষার গ্যারান্টি দেওয়ার একমাত্র উপায় হ'ল এটি কোনও অনুরোধিত ধরণের সাথে একটি নতুন মানচিত্রে অনুলিপি করা যা এতে প্রবেশের অনুমতি দেয় তার গ্যারান্টি দেয়।
ব্যবহারকারী2219808

112

কি দারুন; আমি মনে করি আমি নিজের প্রশ্নের উত্তরটি বের করেছিলাম। আমি নিশ্চিত এটির মূল্য নেই! :)

সমস্যাটি হ'ল castালাই চেক করা হয়নি। সুতরাং, আপনাকে এটি নিজেই পরীক্ষা করে দেখতে হবে। উদাহরণস্বরূপ আপনি কেবলমাত্র একটি প্যারামিটারাইজড প্রকার পরীক্ষা করতে পারবেন না কারণ প্যারামিটারাইজড টাইপ তথ্য রানটাইমটিতে অনুপলব্ধ, সংকলনের সময় মুছে ফেলা হয়েছে।

তবে, উদাহরণস্বরূপ আপনি হ্যাশের প্রতিটি আইটেমের উপর একটি চেক করতে পারেন এবং এটি করতে গিয়ে, আপনি টাইপ-সেফ একটি নতুন হ্যাশ তৈরি করতে পারেন। এবং আপনি কোনও সতর্কতা প্ররোচিত করবেন না।

এমমিয়ার্স এবং এসকো লুনটোলাকে ধন্যবাদ, আমি এখানে মূলত লিখেছি কোডটি প্যারামিটারাইজ করেছি, যাতে এটি কোথাও একটি ইউটিলিটি ক্লাসে গুটিয়ে রাখা যায় এবং কোনও প্যারামিটারাইজড হাশম্যাপের জন্য ব্যবহার করা যেতে পারে। আপনি যদি এটি আরও ভালভাবে বুঝতে চান এবং জেনেরিকের সাথে খুব বেশি পরিচিত না হন তবে আমি এই উত্তরের সম্পাদনার ইতিহাস দেখার জন্য উত্সাহিত করি।

public static <K, V> HashMap<K, V> castHash(HashMap input,
                                            Class<K> keyClass,
                                            Class<V> valueClass) {
  HashMap<K, V> output = new HashMap<K, V>();
  if (input == null)
      return output;
  for (Object key: input.keySet().toArray()) {
    if ((key == null) || (keyClass.isAssignableFrom(key.getClass()))) {
        Object value = input.get(key);
        if ((value == null) || (valueClass.isAssignableFrom(value.getClass()))) {
            K k = keyClass.cast(key);
            V v = valueClass.cast(value);
            output.put(k, v);
        } else {
            throw new AssertionError(
                "Cannot cast to HashMap<"+ keyClass.getSimpleName()
                +", "+ valueClass.getSimpleName() +">"
                +", value "+ value +" is not a "+ valueClass.getSimpleName()
            );
        }
    } else {
        throw new AssertionError(
            "Cannot cast to HashMap<"+ keyClass.getSimpleName()
            +", "+ valueClass.getSimpleName() +">"
            +", key "+ key +" is not a " + keyClass.getSimpleName()
        );
    }
  }
  return output;
}

এটি অনেক কাজ, সম্ভবত খুব সামান্য পুরষ্কারের জন্য ... আমি নিশ্চিত না যে আমি এটি ব্যবহার করব কি না। লোকেরা এটির মূল্যবান কিনা তা মনে করে আমি কোনও মন্তব্যকে প্রশংসা করব। এছাড়াও, আমি উন্নতির পরামর্শগুলির প্রশংসা করব: AssertionErferences নিক্ষেপ করা ছাড়াও আমি আরও ভাল কিছু করতে পারি? আমি আরও ভাল কিছু ফেলতে পারি? আমি কি এটি চেক করা ব্যতিক্রম করব?


68
এই জিনিসগুলি বিভ্রান্তিকর, তবে আমি মনে করি আপনি যা করেছেন তা হ'ল AssertionErferences এর জন্য ClassCastException ট্রেড করা।
ডাস্টিন গেটেজ

59
বাবু, এটি অবশ্যই মূল্যবান নয়! দরিদ্র এসএপি কল্পনা করুন যাকে ফিরে আসতে হবে এবং সেখানে এই জগাখিচুড়ি সহ কিছু কোড সংশোধন করতে হবে। আমি সতর্কবাণী দমন করতে পছন্দ করি না তবে আমি মনে করি এটি এখানে কম খারাপ।
ক্রেগ বি

69
এটি কেবল এটি একটি কুৎসিত, বিভ্রান্তিকর, জগাখিচুড়ি নয় (যখন আপনি একটি প্রচুর মন্তব্য এড়াতে পারবেন না তবে এটির মাধ্যমে রক্ষণাবেক্ষণ প্রোগ্রামারটি হাঁটা যায়); সংগ্রহের প্রতিটি উপাদানের উপরে পুনরাবৃত্তি কাস্টটিকে O (1) থেকে O (n) ক্রিয়ায় পরিণত করে। এটি এমন এক জিনিস যা কখনই প্রত্যাশিত হয় না এবং সহজেই একটি ভয়াবহ রহস্যের মন্দায় পরিণত হতে পারে।
ড্যান ইজ ফিজলিং ফায়ারলাইট

22
@ ড্যানিয়েলি আপনি সঠিক আছেন সাধারণভাবে, কারও কখনও এটি করা উচিত নয়।
skiphoppy

4
কিছু মন্তব্য ... পদ্ধতির স্বাক্ষরটি ভুল কারণ এটি কোনও জঘন্য জিনিস "কাস্ট" করে না, এটি বিদ্যমান মানচিত্রটিকে একটি নতুন মানচিত্রে অনুলিপি করে। এছাড়াও, সম্ভবত কোনও মানচিত্র গ্রহণ করার জন্য এটি রিফ্যাক্টর করা যেতে পারে, এবং নিজেই হ্যাশম্যাপের উপর নির্ভর না করে (যেমন মানচিত্রটি গ্রহণ করুন এবং পদ্ধতি স্বাক্ষরে মানচিত্রটি ফিরিয়ে দিন, এমনকি অভ্যন্তরীণ ধরণের হ্যাশম্যাপ হলেও)। আপনার কোনও নতুন মানচিত্রে ingালাই বা স্টোরেজ করার দরকার নেই - যদি আপনি দৃ error়তা ত্রুটিটি না ফেলে থাকেন তবে প্রদত্ত মানচিত্রে ঠিক এখনকার মতো সঠিক ধরণ রয়েছে। জেনেরিক ধরণের সাথে একটি নতুন মানচিত্র তৈরি করা অর্থহীন কারণ আপনি এখনও এটি কাঁচা তৈরি করতে এবং যা কিছু রাখতে পারেন।
MetroidFan2002

51

ইক্লিপ পছন্দসমূহে, জাভা-> সংকলক-> ত্রুটি / সতর্কতা-> জেনেরিক ধরণগুলিতে যান এবং Ignore unavoidable generic type problemsচেক-বাক্সটি চেক করুন।

এটি প্রশ্নের উদ্দেশ্যকে সন্তুষ্ট করে, অর্থাত্‍

আমি গ্রহণের সতর্কতাগুলি এড়াতে চাই ...

যদি আত্মা না।


1
আহা, এর জন্য ধন্যবাদ :) আমি একটি " uses unchecked or unsafe operations." "ত্রুটি পেয়েছিলাম javac, তবে @SuppressWarnings("unchecked")গ্রহনকে অসন্তুষ্ট করে দমন করা অপ্রয়োজনীয় দাবি করে। চেকমুক্ত এই বক্স-অন্ধকার এবং তোলে javacএকই আচরণ করে, যা আমি চেয়েছিলাম। কোডে সতর্কতাটিকে স্পষ্টভাবে দমন করা Eclipse এর ভিতরে সর্বত্র দমনের চেয়ে অনেক স্পষ্ট।
ডিমো 414

26

আপনি নিম্নলিখিতগুলির মতো একটি ইউটিলিটি ক্লাস তৈরি করতে পারেন এবং চেক না করা সতর্কতা দমন করতে এটি ব্যবহার করতে পারেন।

public class Objects {

    /**
     * Helps to avoid using {@code @SuppressWarnings({"unchecked"})} when casting to a generic type.
     */
    @SuppressWarnings({"unchecked"})
    public static <T> T uncheckedCast(Object obj) {
        return (T) obj;
    }
}

আপনি নিম্নলিখিত হিসাবে এটি ব্যবহার করতে পারেন:

import static Objects.uncheckedCast;
...

HashMap<String, String> getItems(javax.servlet.http.HttpSession session) {
      return uncheckedCast(session.getAttribute("attributeKey"));
}

এ সম্পর্কে আরও কিছু আলোচনা এখানে: http://cleveralias.blogs.com/thought_spearmints/2006/01/suppresswarning.html


18
ডাউনভোটিং নয়, তবে র‌্যাপারটি কেবলমাত্র সতর্কতা দমন করার পরিবর্তে যথাযথভাবে কিছু যুক্ত করে না।
ডাস্টিন গেটেজ

3
এই সমাধান হিসাবে +1 মূল্যবান কোড লাইন নষ্ট করে না।
টিনো

1
@ এরিক অনেক বেশি এই সমস্ত নষ্ট লাইনের জন্য আরও বেশি ব্যয়বহুল বড় এবং উচ্চ-রেজোলিউশন মনিটর, তাদের সমস্ত বড় মনিটরের উপর রাখার জন্য একটি বড় ডেস্ক, বড় ডেস্কে রাখার জন্য একটি বড় ঘর এবং একটি অন্তর্দৃষ্টিপূর্ণ বস ..
তিনো

1
@ এরিক স্ক্রোলবারস, এর জন্য vi? তুমি কি মজা করছ?
টিনো

21

এই জিনিসগুলি শক্ত, তবে এখানে আমার বর্তমান চিন্তাভাবনাগুলি রয়েছে:

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

আমি কেবল অন্ধ নিক্ষেপ করতে পছন্দ করি এবং আমার পক্ষে জেভিএম তার রানটাইম চেক করতে দেয় যেহেতু এপিআই কী ফিরে আসবে সে সম্পর্কে আমাদের "জানা" আছে এবং সাধারণত এপিআই কাজ করে তা ধরে নিতে ইচ্ছুক। আপনার যদি প্রয়োজন হয় তবে কাস্টের উপরে যে কোনও জায়গায় জেনেরিক ব্যবহার করুন। আপনার কাছে এখনও সিঙ্গল ব্লাইন্ড haveালাই থাকার পরে আপনি সত্যিই কিছু কিনছেন না, তবে কমপক্ষে আপনি সেখান থেকে জেনেরিকগুলি ব্যবহার করতে পারেন যাতে জেভিএম আপনাকে আপনার কোডের অন্যান্য টুকরোতে অন্ধ কাস্টগুলি এড়াতে সহায়তা করতে পারে।

এই বিশেষ ক্ষেত্রে, সম্ভবত আপনি সেটএট্রিবিউটে কল দেখতে পারেন এবং টাইপটি কীভাবে চলছে তা দেখতে পাচ্ছেন, তাই কেবল পথে অন্ধভাবে কাস্টিং অনৈতিক নয়। সেটএট্রিবিউটকে উল্লেখ করে একটি মন্তব্য যুক্ত করুন এবং এটি দিয়ে শেষ করুন।


16

এখানে একটি সংক্ষিপ্ত উদাহরণ রয়েছে যা অন্যান্য উত্তরে উল্লিখিত দুটি কৌশল প্রয়োগ করে "চেক না করা" সতর্কতা এড়ায়।

  1. রানটাইম ( Class<T> inputElementClazz) এ প্যারামিটার হিসাবে আগ্রহের ধরণের শ্রেণিটি পাস করুন । তারপরে আপনি ব্যবহার করতে পারেন:inputElementClazz.cast(anyObject);

  2. কোনও সংগ্রহের টাইপ কাস্টিংয়ের জন্য, ওয়াইল্ডকার্ডটি ব্যবহার করবেন? জেনেরিক টাইপের পরিবর্তে টি স্বীকৃতি জানাতে যে আপনি উত্তরাধিকার কোড ( Collection<?> unknownTypeCollection) থেকে কোন ধরণের অবজেক্টের প্রত্যাশা করবেন তা আপনি সত্যই জানেন না । সর্বোপরি, "যাচাই না করা" সতর্কতাটি আমাদের এটি বলতে চায়: আমরা নিশ্চিত হতে পারি না যে আমরা একটি পেয়েছি Collection<T>, সুতরাং সৎ কাজটি হ'ল একটি ব্যবহার করা Collection<?>। যদি একেবারে প্রয়োজন হয়, তবে একটি পরিচিত ধরণের সংগ্রহ এখনও নির্মিত হতে পারে ( Collection<T> knownTypeCollection)।

নীচের উদাহরণে বর্ণিত লিগ্যাসি কোডটির স্ট্রাকচারডভিউয়ারে একটি বৈশিষ্ট্য "ইনপুট" রয়েছে (স্ট্রাকচার্ডভিউয়ার একটি গাছ বা টেবিল উইজেট, "ইনপুট" এর পেছনের ডেটা মডেল)। এই "ইনপুট" কোনও ধরণের জাভা সংগ্রহ হতে পারে।

public void dragFinished(StructuredViewer structuredViewer, Class<T> inputElementClazz) {
    IStructuredSelection selection = (IStructuredSelection) structuredViewer.getSelection();
    // legacy code returns an Object from getFirstElement,
    // the developer knows/hopes it is of type inputElementClazz, but the compiler cannot know
    T firstElement = inputElementClazz.cast(selection.getFirstElement());

    // legacy code returns an object from getInput, so we deal with it as a Collection<?>
    Collection<?> unknownTypeCollection = (Collection<?>) structuredViewer.getInput();

    // for some operations we do not even need a collection with known types
    unknownTypeCollection.remove(firstElement);

    // nothing prevents us from building a Collection of a known type, should we really need one
    Collection<T> knownTypeCollection = new ArrayList<T>();
    for (Object object : unknownTypeCollection) {
        T aT = inputElementClazz.cast(object);
        knownTypeCollection.add(aT);
        System.out.println(aT.getClass());
    }

    structuredViewer.refresh();
}

স্বাভাবিকভাবেই, উপরের কোডটি রানটাইম ত্রুটিগুলি দিতে পারে যদি আমরা ভুল তথ্য প্রকারের সাথে লিগ্যাসি কোড ব্যবহার করি (উদাহরণস্বরূপ যদি আমরা একটি জাভা সংগ্রহের পরিবর্তে স্ট্রাকচার্ডভিউয়ের "ইনপুট" হিসাবে কোনও অ্যারে সেট করি)।

পদ্ধতিটি কল করার উদাহরণ:

dragFinishedStrategy.dragFinished(viewer, Product.class);

13

এইচটিটিপি সেশন জগতে আপনি সত্যিই theালাই এড়াতে পারবেন না, যেহেতু এপিআই এমনভাবে লেখা (কেবল গ্রহণ করে এবং ফিরে আসে Object)

কিছুটা কাজ করে আপনি সহজেই চেক না করা castালাই এড়াতে পারবেন, 'যদিও। এর অর্থ হ'ল এটি ClassCastExceptionকোনও ত্রুটি ঘটলে সেখানে অধিকার প্রদান করে traditionalতিহ্যবাহী কাস্টে পরিণত হবে )। একটি চেক না করা ব্যতিক্রম CCEকাস্টের বিন্দুটির পরিবর্তে যেকোন সময়ে পরিনত হতে পারে (এ কারণেই এটি একটি পৃথক সতর্কবাণী)।

ডেডিকেটেড শ্রেণীর সাথে হ্যাশম্যাপটি প্রতিস্থাপন করুন:

import java.util.AbstractMap;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Attributes extends AbstractMap<String, String> {
    final Map<String, String> content = new HashMap<String, String>();

    @Override
    public Set<Map.Entry<String, String>> entrySet() {
        return content.entrySet();
    }

    @Override
    public Set<String> keySet() {
        return content.keySet();
    }

    @Override
    public Collection<String> values() {
        return content.values();
    }

    @Override
    public String put(final String key, final String value) {
        return content.put(key, value);
    }
}

তার পরিবর্তে সেই শ্রেণিতে কাস্ট করুন Map<String,String>এবং আপনার কোডটি যেখানে লিখছেন ঠিক সেখানে ঠিক সেখানে পরীক্ষা করা হবে। ClassCastExceptionsপরে আর অপ্রত্যাশিত ।


এটি সত্যিই সহায়ক উত্তর।
GPrathap


8

এই বিশেষ ক্ষেত্রে, আমি সরাসরি এইচটিটিপসেশনটিতে মানচিত্র সংরক্ষণ করব না, বরং এটি আমার নিজের শ্রেণীর একটি উদাহরণ, যার পরিবর্তে একটি মানচিত্র (শ্রেণীর প্রয়োগের বিশদ) রয়েছে। তারপরে আপনি নিশ্চিত হতে পারেন যে মানচিত্রের উপাদানগুলি সঠিক ধরণের।

তবে আপনি যদি যাইহোক মানচিত্রের বিষয়বস্তুগুলি সঠিক ধরণের কিনা তা পরীক্ষা করতে চান তবে আপনি এই জাতীয় কোড ব্যবহার করতে পারেন:

public static void main(String[] args) {
    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("a", 1);
    map.put("b", 2);
    Object obj = map;

    Map<String, Integer> ok = safeCastMap(obj, String.class, Integer.class);
    Map<String, String> error = safeCastMap(obj, String.class, String.class);
}

@SuppressWarnings({"unchecked"})
public static <K, V> Map<K, V> safeCastMap(Object map, Class<K> keyType, Class<V> valueType) {
    checkMap(map);
    checkMapContents(keyType, valueType, (Map<?, ?>) map);
    return (Map<K, V>) map;
}

private static void checkMap(Object map) {
    checkType(Map.class, map);
}

private static <K, V> void checkMapContents(Class<K> keyType, Class<V> valueType, Map<?, ?> map) {
    for (Map.Entry<?, ?> entry : map.entrySet()) {
        checkType(keyType, entry.getKey());
        checkType(valueType, entry.getValue());
    }
}

private static <K> void checkType(Class<K> expectedType, Object obj) {
    if (!expectedType.isInstance(obj)) {
        throw new IllegalArgumentException("Expected " + expectedType + " but was " + obj.getClass() + ": " + obj);
    }
}

1
অসাধারণ; আমি মনে করি আমি এটিকে প্যারামিটারাইজ করার জন্য আমার জবাবের সাথে একত্রিত করতে পারি এবং সতর্কতাগুলি পুরোপুরি দমন করতে এড়াতে পারি!
skiphoppy

1
রানটাইম চেক সহ নিরাপদে এটি করার জন্য +1 সম্ভবত সেরা রেসিপি (সহজে বুঝতে এবং বজায় রাখা)
টিনো

8

এস্কো লুনটোলা দ্বারা উপরের উত্তরে অবজেক্টস-অনীকৃত ইউটিলিটি ফাংশন প্রোগ্রামের গোলমাল এড়ানোর দুর্দান্ত উপায়।

আপনি যদি একটি সম্পূর্ণ পদ্ধতিতে দমন-সতর্কতা না চান তবে জাভা আপনাকে এটি একটি স্থানীয়তে চাপিয়ে দিতে বাধ্য করে। আপনার যদি কোনও সদস্যের জন্য একটি কাস্ট প্রয়োজন হয় তবে এটি এর মতো কোড তৈরি করতে পারে:

@SuppressWarnings("unchecked")
Vector<String> watchedSymbolsClone = (Vector<String>) watchedSymbols.clone();
this.watchedSymbols = watchedSymbolsClone;

ইউটিলিটিটি ব্যবহার করা অনেক পরিষ্কার এবং আপনি কী করছেন তা এখনও স্পষ্ট:

this.watchedSymbols = Objects.uncheckedCast(watchedSymbols.clone());

দ্রষ্টব্য: আমি এটি যুক্ত করা গুরুত্বপূর্ণ মনে করি যে কখনও কখনও সতর্কতার সত্যিকার অর্থেই আপনি কিছু ভুল করে যাচ্ছেন:

ArrayList<Integer> intList = new ArrayList<Integer>();
intList.add(1);
Object intListObject = intList; 

 // this line gives an unchecked warning - but no runtime error
ArrayList<String> stringList  = (ArrayList<String>) intListObject;
System.out.println(stringList.get(0)); // cast exception will be given here

সংকলক আপনাকে যা বলছে তা হ'ল এই কাস্টটি রানটাইমের সময় যাচাই করা হবে না, সুতরাং জেনেরিক ধারকটিতে ডেটা অ্যাক্সেস করার চেষ্টা না করা পর্যন্ত কোনও রানটাইম ত্রুটি উত্থাপিত হবে না।


5

সতর্কতা দমন কোনও সমাধান নয়। আপনার এক বিবৃতিতে দুটি স্তরের ingালাই করা উচিত নয়।

HashMap<String, String> getItems(javax.servlet.http.HttpSession session) {

    // first, cast the returned Object to generic HashMap<?,?>
    HashMap<?, ?> theHash = (HashMap<?, ?>)session.getAttribute("attributeKey");

    // next, cast every entry of the HashMap to the required type <String, String>
    HashMap<String, String> returingHash = new HashMap<>();
    for (Entry<?, ?> entry : theHash.entrySet()) {
        returingHash.put((String) entry.getKey(), (String) entry.getValue());
    }
    return returingHash;
}

1
তার পাঁচ বছরের প্রশ্ন? আপনার কি এত বেশি কাজ করা দরকার? প্রদত্ত জাভাতে টাইপ মুছে ফেলা হয়েছে দ্বিতীয় হ্যাশম্যাপটি রানটাইমের সময় প্রথমটির মতো হওয়া উচিত; আমি মনে করি এটি আরও কার্যকর হবে এবং অনুলিপিটি এড়িয়ে চলুন যদি আপনি কেবল এন্ট্রিগুলির মাধ্যমে পুনরাবৃত্তি করেন এবং যাচাই করেন যে সেগুলি সমস্ত স্ট্রিংয়ের উদাহরণ ছিল। অথবা, টিবিএইচ, আপনি যে সার্ভলেট জেআর ব্যবহার করছেন তার উত্সটি পরীক্ষা করুন এবং এটি কেবল কখনও স্ট্রিং রাখে তা যাচাই করুন।
রুপ

1
আজ অবধি আমি প্রকল্পগুলিতে এই সতর্কতাটি দেখছি। তার সমস্যাটি ধরণের যাচাইকরণ নয়, তবে একটি সতর্কতা একটি "চাপানো" কারণে তৈরি করা হয়েছে যা একটি অবিচ্ছিন্ন মানচিত্রে।
আব্বাস

2

আপনি যদি আপনার কোড পোস্ট করেন তবে দ্রুত অনুমানটি নিশ্চিতভাবে বলতে পারে তবে আপনি লাইন ধরে কিছু করতে পারেন

HashMap<String, Object> test = new HashMap();

যা আপনাকে যখন করা দরকার তখন সতর্কতা তৈরি করে

HashMap<String, Object> test = new HashMap<String, Object>();

এটি দেখার মতো হতে পারে

জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজে জেনারিক্স

আপনার অপরিচিত হলে কী করা দরকার।


1
দুর্ভাগ্যক্রমে এটি এত সহজ পরিস্থিতি নয়। কোড যুক্ত হয়েছে।
skiphoppy

1
আমি কিছুটা আলাদা সমস্যার উত্তর খুঁজতে এখানে এসেছি: এবং আপনি আমাকে যা বলেছিলেন ঠিক তা বলেছিলেন! ধন্যবাদ!
স্ট্যাটিক্সান

2

আমি প্রশ্নটি ভুল বুঝে থাকতে পারি (উদাহরণ এবং আশেপাশের কয়েকটি লাইন ভাল লাগবে), তবে আপনি সর্বদা একটি উপযুক্ত ইন্টারফেস (এবং জাভা 5 +) ব্যবহার করবেন না কেন? আপনি কখনই কোনও কাস্ট করতে চান তার কোনও কারণ আমি দেখতে পাচ্ছি নাHashMap পরিবর্তেMap<KeyType,ValueType> । আসলে, পরিবর্তনের পরিবর্তে পরিবর্তনের ধরণের সেট করার কোনও কারণ আমি কল্পনা করতে পারি না ।HashMapMap

এবং কেন উত্স একটি Object ? এটি কি কোনও উত্তরাধিকার সংগ্রহের পরামিতি ধরণের? যদি তা হয় তবে জেনেরিকগুলি ব্যবহার করুন এবং আপনার পছন্দ মতো ধরণটি নির্দিষ্ট করুন।


2
আমি দৃ sure়ভাবে নিশ্চিত যে এই ক্ষেত্রে মানচিত্রে স্যুইচ করা কোনও পরিবর্তন করবে না, তবে প্রোগ্রামিং টিপটির জন্য ধন্যবাদ, যেহেতু আরও ভাল করার জন্য আমি কিছু জিনিস করার পদ্ধতি পরিবর্তন করতে পারি। অবজেক্টের উত্সটি এমন একটি এপিআই যা আমার কোনও নিয়ন্ত্রণ নেই (কোড যুক্ত))
skiphoppy

2

যদি আমাকে এমন একটি এপিআই ব্যবহার করতে হয় যা জেনেরিক্সকে সমর্থন করে না .. আমি চেষ্টা করি এবং যতটা সম্ভব কম লাইন দিয়ে মোড়ক রুটিনগুলিতে সেই কলগুলি বিচ্ছিন্ন করি। তারপরে আমি সপ্রেস ওয়ার্নিংস টিকাটি ব্যবহার করি এবং একই সাথে টাইপ-সুরক্ষা কাস্টও যুক্ত করি।

জিনিসগুলি যতটা সম্ভব ঝরঝরে রাখতে এটি কেবল ব্যক্তিগত পছন্দ।


2

এটি ধরুন, নতুন হ্যাশম্যাপ তৈরি করার চেয়ে এটি দ্রুততর, যদি এটি ইতিমধ্যে একটি হয় তবে এখনও সুরক্ষিত থাকে, কারণ প্রতিটি উপাদানটি এর ধরণের বিরুদ্ধে পরীক্ষা করা হয় ...

@SuppressWarnings("unchecked")
public static <K, V> HashMap<K, V> toHashMap(Object input, Class<K> key, Class<V> value) {
       assert input instanceof Map : input;

       for (Map.Entry<?, ?> e : ((HashMap<?, ?>) input).entrySet()) {
           assert key.isAssignableFrom(e.getKey().getClass()) : "Map contains invalid keys";
           assert value.isAssignableFrom(e.getValue().getClass()) : "Map contains invalid values";
       }

       if (input instanceof HashMap)
           return (HashMap<K, V>) input;
       return new HashMap<K, V>((Map<K, V>) input);
    }

key.isAssignableFrom(e.getKey().getClass())key.isInstance(e.getKey())
ইউজার 102008

1

আপনি এটি কাস্ট করার আগে এটি টাইপচেক করুন।

Object someObject = session.getAttribute("attributeKey");
if(someObject instanceof HashMap)
HashMap<String, String> theHash = (HashMap<String, String>)someObject;  

এবং যে কারো জিজ্ঞাসা করার জন্য, আপনি যে ধরণের বিষয়ে নিশ্চিত নন সেখানে অবজেক্টগুলি পাওয়া খুব সাধারণ। প্রচুর উত্তরাধিকার "এসওএ" বাস্তবায়ন বিভিন্ন অবজেক্টের চারপাশে পাস করে যা আপনার সর্বদা বিশ্বাস করা উচিত নয়। (ভয়াবহতা!)

সম্পাদকের পোস্টারের আপডেটগুলির সাথে মেলে একবার উদাহরণ কোডটি পরিবর্তন করা হয়েছে এবং কিছু মন্তব্য অনুসরণ করে আমি দেখছি যে উদাহরণটি জেনেরিকের সাথে খুব ভাল খেলছে না। তবে বাইরের অবজেক্টটি যাচাই করতে চেক পরিবর্তন করা কমান্ডলাইন সংকলকটির সাথে ভাল খেলছে বলে মনে হচ্ছে। সংশোধিত উদাহরণ এখন পোস্ট করা হয়েছে।


8
দুর্ভাগ্যক্রমে, জেনেরিকগুলি সেই অসম্ভবকে রেন্ডার করে। এটি কেবল একটি হ্যাশম্যাপ নয়, এটি টাইপ তথ্য সহ একটি হ্যাশম্যাপ। এবং যদি আমি এই তথ্যটি অপসারণ করি, তবে আমি কেবল সতর্কতাগুলি অন্যত্র ঠেলে দেব।
skiphoppy

1

কম্পিউটার সায়েন্সে প্রায় প্রতিটি সমস্যা ইন্ডিয়ারেশন * বা কিছু কিছু যুক্ত করে সমাধান করা যেতে পারে।

সুতরাং একটি নন-জেনেরিক বস্তু প্রবর্তন করুন এটি একটি উচ্চ স্তরের যা ক Map। কোনও প্রসঙ্গের সাথে এটি খুব দৃinc়প্রত্যেক দেখাচ্ছে না, তবে যাইহোক:

public final class Items implements java.io.Serializable {
    private static final long serialVersionUID = 1L;
    private Map<String,String> map;
    public Items(Map<String,String> map) {
        this.map = New.immutableMap(map);
    }
    public Map<String,String> getMap() {
        return map;
    }
    @Override public String toString() {
        return map.toString();
    }
}

public final class New {
    public static <K,V> Map<K,V> immutableMap(
        Map<? extends K, ? extends V> original
    ) {
        // ... optimise as you wish...
        return Collections.unmodifiableMap(
            new HashMap<String,String>(original)
        );
    }
}

static Map<String, String> getItems(HttpSession session) {
    Items items = (Items)
        session.getAttribute("attributeKey");
    return items.getMap();
}

* অনেক বেশি মাত্রার ইন্ডিয়ারেশন ব্যতীত।


1
উক্তিটি প্রয়াত অধ্যাপক ডেভিড হুইলারের কাছে দায়ী। en.wikedia.org/wiki/…
স্টিফেন সি

1

আমি যখন equals()অপারেশনটিকে ওভাররাইড করি তখন আমি এটি পরিচালনা করার একটি উপায় ।

public abstract class Section<T extends Section> extends Element<Section<T>> {
    Object attr1;

    /**
    * Compare one section object to another.
    *
    * @param obj the object being compared with this section object
    * @return true if this section and the other section are of the same
    * sub-class of section and their component fields are the same, false
    * otherwise
    */       
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            // this exists, but obj doesn't, so they can't be equal!
            return false;
        }

        // prepare to cast...
        Section<?> other;

        if (getClass() != obj.getClass()) {
            // looks like we're comparing apples to oranges
            return false;
        } else {
            // it must be safe to make that cast!
            other = (Section<?>) obj;
        }

        // and then I compare attributes between this and other
        return this.attr1.equals(other.attr1);
    }
}

এটি জাভা 8 তে কাজ করছে বলে মনে হচ্ছে (এমনকি এটি সংকলিত -Xlint:unchecked)


0

আপনি যদি নিশ্চিত হন যে সেশনটি দিয়ে ফিরে আসা টাইপটি হ'ল অ্যাশট্রিবিউট () হ্যাশম্যাপ হয় তবে আপনি সেই সঠিক টাইপটিতে টাইপকাস্ট করতে পারবেন না, তবে কেবল জেনেরিক হ্যাশম্যাপ যাচাইয়ের উপর নির্ভর করুন

HashMap<?,?> getItems(javax.servlet.http.HttpSession session) {  
    HashMap<?,?> theHash = (HashMap<?,?>)session.getAttribute("attributeKey");
    return theHash;
} 

গ্রহণের পরে সতর্কতাগুলি অবাক করে দেবে, তবে অবশ্যই এটি রানটাইম ত্রুটিগুলির দিকে পরিচালিত করতে পারে যা ডিবাগ করা শক্ত হতে পারে। আমি এই পদ্ধতিটি কেবল অপারেশন-সমালোচনা প্রসঙ্গে নয়।


0

দুটি উপায়, একটি যা সম্পূর্ণরূপে ট্যাগটিকে এড়িয়ে চলে, অন্যটি দুষ্টু তবে দুর্দান্ত ইউটিলিটি পদ্ধতি ব্যবহার করে।
সমস্যাটি পূর্ব-জেনারাইজড সংগ্রহসমূহ ...
আমি বিশ্বাস করি যে থাম্বের নিয়মটি হ'ল: "এক সময় এক জিনিসকে নিক্ষেপ করুন" - জেনারিকাইজড বিশ্বে কাঁচা শ্রেণি ব্যবহার করার চেষ্টা করার অর্থ এর অর্থ হ'ল আপনি কী জানেন না এই মানচিত্রে <?,?> (এবং প্রকৃতপক্ষে জেভিএম সম্ভবত এটি একটি মানচিত্রও নয়!) দেখতে পাওয়া যায়, আপনি যখন এটি সম্পর্কে ক্যাপচার করতে পারবেন না তখন আপনি তা ভাববেন না obvious যদি আপনার কাছে মানচিত্র <স্ট্রিং,?> ম্যাপ 2 থাকে তবে হ্যাশসেট <স্ট্রিং> কীগুলি = (হ্যাশসেট <স্ট্রিং>) map2.keySet () এটি সংকলকের জন্য "বিশ্বাসের কাজ" হওয়া সত্ত্বেও আপনাকে একটি সতর্কতা দেয় না (কারণ এটি একটি ট্রিসেট হিসাবে পরিণত হতে পারে) ... তবে এটি কেবল বিশ্বাসের একক কাজ।

আমার প্রথম উপায়ে যেমন পুনরাবৃত্তি হচ্ছে "বিরক্তিকর" এবং "সময় নেয়" এর আপত্তিটির বিষয়ে পিএস, উত্তরটি "কোনও ব্যথা হ'ল না": জেনারিকাইজড সংগ্রহে মানচিত্র রয়েছে .এন্ট্রি <স্ট্রিং, স্ট্রিং> গুলি এবং কিছুই নেই অন্য। এই গ্যারান্টিটির জন্য আপনাকে অর্থ প্রদান করতে হবে। জেনারিকগুলি পদ্ধতিগতভাবে এই অর্থ প্রদানের সময়, সুন্দরভাবে, কোডিং কমপ্লায়েন্সের রূপ নেয়, মেশিনের সময় নয়!
একটি বিদ্যালয়ের চিন্তাধারা বলতে পারে যে সতর্কতা না দিয়ে আপনার যেমন চেক না করা ক্যাসেটের ত্রুটি করার জন্য গ্রহগ্রহের সেটিংস সেট করা উচিত। সেক্ষেত্রে আপনাকে আমার প্রথম উপায়টি ব্যবহার করতে হবে।

package scratchpad;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Vector;

public class YellowMouse {

    // First way

    Map<String, String> getHashMapStudiouslyAvoidingSuppressTag(HttpSession session) {
      Map<?, ?> theHash = (Map<?, ?>)session.getAttribute("attributeKey");

      Map<String, String> yellowMouse = new HashMap<String, String>();
      for( Map.Entry<?, ?> entry : theHash.entrySet() ){
        yellowMouse.put( (String)entry.getKey(), (String)entry.getValue() );
      }

      return yellowMouse;
    }


    // Second way

    Map<String, String> getHashMapUsingNaughtyButNiceUtilityMethod(HttpSession session) {
      return uncheckedCast( session.getAttribute("attributeKey") );
    }


    // NB this is a utility method which should be kept in your utility library. If you do that it will
    // be the *only* time in your entire life that you will have to use this particular tag!!

    @SuppressWarnings({ "unchecked" })
    public static synchronized <T> T uncheckedCast(Object obj) {
        return (T) obj;
    }


}

আপনার মন্তব্যের অধিকার নেই এমনটি আপনাকে নিজের মন্তব্য যুক্ত করার জন্য অন্যের উত্তর সম্পাদনা করার অনুমতি দেয় না; আপনি অন্যের উত্তরগুলি বিন্যাসে, সিনট্যাক্সে উন্নত করতে ... তাদের প্রতি আপনার মতামত যুক্ত করার জন্য সম্পাদনা করেন। আপনি যখন 50 রেপে পৌঁছে যাবেন আপনি সর্বত্র মন্তব্য করতে সক্ষম হবেন, ইতিমধ্যে আমি নিশ্চিত আপনি প্রতিরোধ করতে পারবেন (বা, যদি আপনি সত্যিই না পারেন তবে আপনার পোস্টে বিদ্যমান উত্তরে আপনার মন্তব্য লিখুন)। (অন্যদের জন্য নোট করুন: আমি এটি লিখেছি কারণ আমি দেখেছি - এবং প্রত্যাখ্যান করেছি - সংযোজন সরঞ্জামগুলির মধ্যে অন্যান্য পোস্টগুলিতে তার প্রস্তাবিত মন্তব্যসমূহ-সম্পাদনাগুলি)
মাত্তিও ইটালিয়া

-1

এটি সতর্কতাগুলি দূরে সরিয়ে দেয় ...

 static Map<String, String> getItems(HttpSession session) {
        HashMap<?, ?> theHash1 = (HashMap<String,String>)session.getAttribute("attributeKey");
        HashMap<String,String> theHash = (HashMap<String,String>)theHash1;
    return theHash;
}

1
না এটা হয় না। আসলে, এটি দুটি সতর্কতা তৈরি করে যেখানে প্রথমটি ছিল one
স্টিজন ডি উইট

আহ, ঠিক আছে. আমি কেন ভেবেছি তা নিশ্চিত নয়।
শুক্র

-3

সমাধান: Eclipse এ এই সতর্কতাটি অক্ষম করুন। এটি সাপ্লাইস সতর্কতাগুলি দিবেন না, কেবল এটি সম্পূর্ণরূপে অক্ষম করুন।

উপরের উপস্থাপিত বেশ কয়েকটি "সমাধান" হ'ল লাইন ছাড়াই, একটি নির্লিপ্ত সতর্কতা দমনের উদ্দেশ্যে কোডটিকে অপঠনযোগ্য করে তোলে।


9
আমি কি জিজ্ঞেস করতে পারি কেন? বিশ্বব্যাপী একটি সতর্কতা অক্ষম করা অন্য যে কোনও জায়গায় এই সমস্যাটি সত্যই লুকিয়ে রাখবে। একটি যুক্ত করা @SuppressWarningsকোডটি একেবারেই অপঠনযোগ্য করে তোলে না।
এমবিআইডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.