سؤال

هنا هو رمزي:

Object[] data = GeneComparison.readData(files);
MyGenome genome = (MyGenome) data[0];
LinkedList<Species> breeds = (LinkedList<Species>) data[1];

إنه يعطي هذا التحذير من القائمة الارتباط:

Type safety: Unchecked cast from Object to LinkedList<Species>

لماذا يشكو من القائمة المرتبطة وليس myGenome؟

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

المحلول

لأنه هنا:

MyGenome genome = (MyGenome) data[0];

أنت لا تستخدم الأجهزة

و هنا

LinkedList<Species> breeds = (LinkedList<Species>) data[1];

أنت تستخدمها.

هذا مجرد تحذير، أنت تخليص أنواع في صفيف البيانات. إذا كنت تعرف ماذا تفعل (أعني، إذا كان العنصر الثاني يحتوي على linkedlist. ) يمكنك تجاهل التحذير.

ولكن من الأفضل أن يكون لديك كائن مثل هذا:

class Anything {
    private Object [] data;
    public Anything( Object [] data ) {
         this.data = data;
    }
    public Gnome getGnome() {
    .....
    }
    public List<Species> getBreeds() {
    ......
    }
 }

وأن تضطر إلى طرح الأشياء المناسبة، قبل التحويل الصحيح حتى ينتهي بك الأمر إلى:

Anything anything = new Anything( GeneComparison.readData(files) );
MyGenome genome             = anything.getGnome(); // similar to data[0]
LinkedList<Species> breeds = anything.getBreeds(); // similar to data[1];

داخل تلك الطرق عليك القيام به التحولات المناسبة.

نصائح أخرى

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

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

في كثير من الأحيان للتخلص من هذا التحذير عليك أن تفعل شيئا مثل:

@SuppressWarning("unchecked")
public List<Something> getAll() {
  return getSqlMapClient.queryForList("queryname");
}

حيث إرجاع QueryForList () قائمة (غير معلمة) حيث تعرف أن المحتويات ستكون ذات فئة شيء.

الجانب الآخر لهذا هو أن المصفوفات في جافا هي covarian., ، وهذا يعني أنها تحتفظ بمعلومات نوع وقت التشغيل. علي سبيل المثال:

Integer ints[] = new Integer[10];
Object objs[] = ints;
objs[3] = "hello";

سوف رمي استثناء. ولكن:

List<Integer> ints = new ArrayList<Integer>(10);
List<Object> objs = (List<Object>)ints;
objs.add("hello");

هو قانونية تماما.

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