لماذا يتم إلقاؤه كلاسكاستد فقط عند الوصول إلى قيمة الإرجاع؟

StackOverflow https://stackoverflow.com/questions/1268623

  •  13-09-2019
  •  | 
  •  

سؤال

متعلق ب هذا السؤال

بالنظر إلى هذه الوظيفة:

public static <S extends CharSequence> S foo(S s) {
  return (S) new StringBuilder(s);
}

لماذا ينفذ هذا الاحتجاج دون استثناء:

foo("hello");

ولكن هذا يرمي كل شيء classcastException؟

System.out.println(foo("hello"));
هل كانت مفيدة؟

المحلول

الجنراء في جاوة 5/6 تمحس نوع, ، مما يعني أن أي نوع عام هو جذريا فقط Object اكتب (أو مهما كان نوع القاسم الأقل شيوعا، وهو في هذه الحالة CharSequence) في وقت التشغيل. يتم إدراج المصابيح المناسبة أينما كانت اللازمة. لذلك يتم محو طريقتك إلى شيء يبدو وكأنه هذا:

public static CharSequence foo(CharSequence s) {
  return (CharSequence) new StringBuilder(s);
}

ويحصل مكالمتك - تمحى ذلك إلى هذا:

System.out.println((String)foo("hello"));

يبدو أن جافا لن يزعج إدراج (String) يلقي إذا لم يتم استخدام قيمة الإرجاع أبدا - لماذا تهتم؟

نصائح أخرى

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

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