سؤال

في وقت ما عند النظر إلى التعليمات البرمجية، أرى العديد من الطرق تحديد شرح:

@SuppressWarnings("unchecked")

ماذا يعني هذا؟

هل كانت مفيدة؟

المحلول

في بعض الأحيان لا يسمح لك Java Generics بفعل ما تريد، وتحتاج إلى إخبار المحول البرمجي بفعالية أن ما تقوم به حقا إرادة أن تكون قانونية في وقت التنفيذ.

عادة ما أجد هذا الألم عند السخرية على واجهة عامة، ولكن هناك أمثلة أخرى أيضا. عادة ما يستحق محاولة العمل طريقة لتجنب التحذير بدلا من قمعها ( java generics التعليمات يساعد هنا) ولكن في بعض الأحيان حتى لو كان ذلك هو ممكن، ينحني الشفرة من الشكل الكثير مما قمع التحذير هو Neater. أضف دائما تعليق توضيحي في هذه الحالة!

نفس الأدوات التعليمية لديها العديد من الأقسام في هذا الموضوع، بدءا من "ما هو" تحذير "غير مربوط"؟ - إنه يستحق القراءة.

نصائح أخرى

إنه عبارة عن شرح لإحضار تحذيرات تجميعها حول العمليات العامة التي لم يتم التحقق منها (وليس استثناءات)، مثل المصابيح. إنه يعني أساسا أن المبرمج لا يرغب في إخطار بهذه التي يدركها بالفعل عند تجميع جزء معين من التعليمات البرمجية.

يمكنك قراءة المزيد حول هذا التعليق التوضيحي المحدد هنا:

قمع تحذيرات

بالإضافة إلى ذلك، توفر Oracle بعض وثائق البرنامج التعليمي على استخدام التعليقات التوضيحية هنا:

التوضيحية

كما وضعها،

"يمكن أن يحدث تحذير" غير مربوط "عند توزيع التعليمات البرمجية القديمة المكتوبة قبل ظهور الأجداد (تمت مناقشته في الدرس بعنوان الأردن)."

قد يعني أيضا أن إصدار نظام Java Type الحالي غير جيد بما فيه الكفاية لحالتك. كان هناك عدة المقترحات JSR. / Hacks لإصلاح هذا: Type Tokens، سوبر نوع الرموز, ، class.cast ().

إذا كنت بحاجة فعلا إلى هذا الكحاف، فقد تضييق نطاقه قدر الإمكان (على سبيل المثال، فلا تضعه على الفصل نفسه أو على طريقة طويلة). مثال:

public List<String> getALegacyListReversed() {
   @SuppressWarnings("unchecked") List<String> list =
       (List<String>)legacyLibrary.getStringList();

   Collections.reverse(list);
   return list;
}

ال suppresswarning. يستخدم التعليق التوضيحي لقمع تحذيرات المحول البرمجي للعنصر المشروح. على وجه التحديد، unchecked الفئة تتيح قمع تحذيرات المحول البرمجي الناتج نتيجة لملصقات النوع التي لم يتم التحقق منها.

ببساطة: إنه تحذير يشير إليه المحول البرمجي إلى أنه لا يمكنه ضمان سلامة النوع.

طريقة خدمة JPA على سبيل المثال:

@SuppressWarnings("unchecked")
public List<User> findAllUsers(){
    Query query = entitymanager.createQuery("SELECT u FROM User u");
    return (List<User>)query.getResultList();
}

إذا لم أكن قد قمت بالتمييز بين suppresswarnings ("غير مربوط") هنا، فسيكون له مشكلة في الخط، حيث أريد إرجاع قائمة الناتج الخاصة بي.

بمعنى أمان نوع الاختصار: يعتبر البرنامج آمنا من النوع آمنا إذا كان يجمع دون أخطاء وتحذيرات ولا يرفع أي نكل ماغي غير متوقع S في وقت التشغيل.

أنا بناء على http://www.angelikalanger.com/genericsfaq/faqsations/fundamentals.html.

في جاوة، يتم تنفيذ الأردن عن طريق محو النوع. على سبيل المثال، التعليمات البرمجية التالية.

List<String> hello = List.of("a", "b");
String example = hello.get(0);

يتم تجميعها بما يلي.

List hello = List.of("a", "b");
String example = (String) hello.get(0);

و List.of يعرف ب.

static <E> List<E> of(E e1, E e2);

الذي يصبح محو النوع بعد.

static List of(Object e1, Object e2);

ليس لدى المحول البرمجي أي فكرة عما هي أنواع عامة في وقت التشغيل، لذلك إذا كتبت شيئا كهذا.

Object list = List.of("a", "b");
List<Integer> actualList = (List<Integer>) list;

ليس لدى Java Virtual Machine أي فكرة عن أنواع عامة أثناء تشغيل برنامج، لذلك هذا يجمع ويعمل، كما هو الحال بالنسبة لجهاز Java Virtual Machine، هذا يلقي List اكتب (هذا هو الشيء الوحيد الذي يمكن التحقق منه، لذلك يتحقق من ذلك فقط).

ولكن الآن أضف هذا الخط.

Integer hello = actualList.get(0);

و JVM سوف رمي غير متوقع ClassCastException, ، كما قام جافا برغم مترجم بإدخال ممثلين ضمنية.

java.lang.ClassCastException: java.base/java.lang.String cannot be cast to java.base/java.lang.Integer

أ unchecked تحكي تحذير مبرمج قد يؤدي إلى إلقاء برنامج رمي استثناء في مكان آخر. قمع التحذير @SuppressWarnings("unchecked") يروي المحول البرمجي أن المبرمج يعتقد أن القانون ليكون آمنا ولن يسبب استثناءات غير متوقعة.

لماذا تريد أن تفعل ذلك؟ نظام نوع Java ليس جيدا بما يكفي لتمثيل جميع أنماط استخدام النوع الممكنة. في بعض الأحيان قد تعرف أن المصبوب آمن، لكن جافا لا تقدم وسيلة لقول ذلك - لإخفاء التحذيرات مثل هذا، @SupressWarnings("unchecked") يمكن استخدامها، بحيث يمكن للمبرمج التركيز على التحذيرات الحقيقية. على سبيل المثال، Optional.empty() إرجاع Singleton لتجنب تخصيص أخريات فارغة لا تخزن قيمة.

private static final Optional<?> EMPTY = new Optional<>();
public static<T> Optional<T> empty() {
    @SuppressWarnings("unchecked")
    Optional<T> t = (Optional<T>) EMPTY;
    return t;
}

هذا المصبوب آمن، حيث لا يمكن استرجاع القيمة المخزنة في اختياري فارغ لذلك لا يوجد خطر استثناءات صحيحة غير متوقعة.

يمكنك قمع تحذيرات المحول البرمجي وإخبار الجنراء بأن الكود الذي كتبته هو قانونية وفقا لذلك.

مثال:

@SuppressWarnings("unchecked")
public List<ReservationMealPlan> retreiveMealPlan() {
     List<ReservationMealPlan> list=new ArrayList<ReservationMealPlan>();
    TestMenuService testMenuService=new TestMenuService(em, this.selectedInstance);
    list = testMenuService.getMeal(reservationMealPlan);
    return list;
 }

خدعة واحدة هي إنشاء واجهة تمتد واجهة قاعدة عامة ...

public interface LoadFutures extends Map<UUID, Future<LoadResult>> {}

ثم يمكنك التحقق من ذلك مع instanceof قبل ...

Object obj = context.getAttribute(FUTURES);
if (!(obj instanceof LoadFutures)) {
    String format = "Servlet context attribute \"%s\" is not of type "
            + "LoadFutures. Its type is %s.";
    String msg = String.format(format, FUTURES, obj.getClass());
    throw new RuntimeException(msg);
}
return (LoadFutures) obj;

كما أعرف، في الوقت الحالي يتعلق الأمر بقمع التحذيرات حول الأردن؛ Generics هي إنشاء برمجة جديدة غير مدعومة في إصدارات JDK في وقت سابق من JDK 5، لذلك قد تشكل أي مزيج من البنيات القديمة مع تلك النتائج غير المتوقعة.

يحذر المترجم من مبرمج حوله، ولكن إذا كان المبرمج يعرف بالفعل، فيمكنهم تحويل تلك التحذيرات اللعين قبالة استخدام القمع.

تحذير يشير إليه المحول البرمجي إلى أنه لا يمكنه ضمان سلامة النوع. مصطلح "غير مربوط" تحذير مضلل. هذا لا يعني أن التحذير غير محاضر بأي شكل من الأشكال. يشير المصطلح "غير محدد" إلى حقيقة أن المترجم ونظام التشغيل لا يحتوي على معلومات كافية من نوع لأداء جميع أنواع الشيكات التي ستكون ضرورية لضمان نوع السلامة. بهذا المعنى، تعد بعض العمليات "غير محددة".

المصدر الأكثر شيوعا من تحذيرات "غير مرفوعة" هو استخدام الأنواع الخام. يتم إصدار تحذيرات "غير محددة" عند الوصول إلى كائن من خلال متغير من نوع الخام، لأن النوع الخام لا يوفر معلومات كافية من نوع لأداء جميع الشيكات من النوع الضروري.

مثال (من التحذير غير المعالج بالتزامن مع أنواع RAW):

TreeSet set = new TreeSet(); 
set.add("abc");        // unchecked warning 
set.remove("abc");
warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.TreeSet 
               set.add("abc");  
                      ^

عند استدعاء طريقة الإضافة، لا يعرف المحول البرمجي ما إذا كان من الآمن إضافة كائن سلسلة إلى المجموعة. إذا كانت الأصهر عبارة عن مجموعة تحتوي على سلسلة S (أو SuperType منها)، فستكون آمنا. ولكن من المعلومات النوع التي توفرها Your The Beteset، لا يمكن أن يخبر المحول البرمجي. وبالتالي فإن المكالمة غير آمنة وتصدر تحذير "غير مربوط".

يتم الإبلاغ عن "تحذيرات" غير محددة "أيضا عندما يجد المحول البرمجي مقصا نوعه هو إما نوع معلمات معلمة أو معلمة نوع.

مثال (من تحذير غير مربوط بالاقتران مع إيصال إلى نوع معين أو نوع متغير):

  class Wrapper<T> { 
  private T wrapped ; 
  public Wrapper (T arg) {wrapped = arg;} 
  ... 
  public Wrapper <T> clone() { 
    Wrapper<T> clon = null; 
     try {  
       clon = (Wrapper<T>) super.clone(); // unchecked warning 
     } catch (CloneNotSupportedException e) {  
       throw new InternalError();  
     } 
     try {  
       Class<?> clzz = this.wrapped.getClass(); 
       Method   meth = clzz.getMethod("clone", new Class[0]); 
       Object   dupl = meth.invoke(this.wrapped, new Object[0]); 
       clon.wrapped = (T) dupl; // unchecked warning 
     } catch (Exception e) {} 
     return clon; 
  } 
} 
warning: [unchecked] unchecked cast 
found   : java.lang.Object 
required: Wrapper <T> 
                  clon = ( Wrapper <T>)super.clone();  
                                                ^ 
warning: [unchecked] unchecked cast 
found   : java.lang.Object 
required: T 
                  clon. wrapped = (T)dupl;

يلقي نوعا ما هو نوع المستهدف إما نوعا قياسيا (ملموسة أو برية حمراء) أو معلمة نوع غير آمن، إذا كان فحص نوع ديناميكي في وقت التشغيل متورط. عند وقت التشغيل، يتوفر محو النوع فقط، وليس النوع الثابت بالضبط المرئي في التعليمات البرمجية المصدر. نتيجة لذلك، يتم تنفيذ جزء وقت تشغيل المصبوب بناء على محو النوع، وليس على النوع الثابت بالضبط.

في المثال، سيحقق الواجهة المقدمة إلى الغلاف ما إذا كان الكائن الذي تم إرجاعه من Super.clone هو غلاف، وليس ما إذا كان مجمعا مع نوع معين من الأعضاء. وبالمثل، فإن المشابك مع معلمة النوع T تتمثل في كتابة كائن في وقت التشغيل، وربما الأمثل بعيدا تماما. نظرا لنوع المحور، يكون نظام وقت التشغيل غير قادر على إجراء فحص أنواع أكثر فائدة في وقت التشغيل.

بطريقة ما، فإن التعليمات البرمجية المصدر مضللة، لأنها تشير إلى أنه يتم تنفيذ الوضوح إلى النوع المستهدف المعني، في الواقع الجزء الديناميكي من الشيكات التي يلقيها فقط ضد محو النوع للنوع المستهدف. يتم إصدار تحذير "غير مربوط" لرسم انتباه المبرمج إلى عدم التطابق بين الجانب الثابت والديناميكي من الوكيل.

يرجى الرجوع: ما هو تحذير "غير مربوط"؟

تعتبر SuppressWarnings Ascingation واحدة من التعليقات التوضيحية المدمجة الثلاثة المتوفرة في JDK وأضفت إلى جانب RoverArride و DePrecated في Java 1.5.

تتضمن SuppressWarnings المترجم لتجاهل أو قمع التحذير المحدد المحدد في العنصر المشرف وجميع عناصر البرنامج داخل هذا العنصر. على سبيل المثال، إذا تم تفاح وجود فئة لقمع تحذير معين، فسيتم فصل التحذير الناتج عن طريقة داخل تلك الفئة.

ربما تكون قد شاهدت suppresswarnings ("غير مربوط") و suppresswarnings ("التسلسل")، اثنان من الأمثلة الأكثر شيوعا في @ suppresswarnings التوضيحية. يستخدم السابق لقمع التحذير الذي تم إنشاؤه بسبب الصب الذي لم يتم التحقق منه أثناء استخدام التحذير اللاحق لتذكيره بإضافة SerialVersionUID في فئة متسلسلة.

اقرأ أكثر: https://javarevisited.blogspot.com/blogspot.com/09/09/what-is-suppresswarnings-notation-in-java-unchected-raw-serial.html#ixzz5rqqaolua.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top