لماذا يتم إلقاؤه كلاسكاستد فقط عند الوصول إلى قيمة الإرجاع؟
-
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)
يلقي إذا لم يتم استخدام قيمة الإرجاع أبدا - لماذا تهتم؟
نصائح أخرى
تتوفر أنواع عامة فقط للمترجم، وهي تموجها (تم حذفها بشكل أساسي) في وقت التشغيل. لذلك يتم تجاهل المصبون داخل الطريقة
لا تنتمي إلى StackOverflow