سؤال

وأنا جديدة جدا لprocessing.org وجافا. أحاول لتخزين الكائنات في HashMap، ثم أعاد على قيم HashMap، داعيا الأساليب على الكائنات المخزنة. من أجل القيام بذلك، وأفترض أحتاج إلى مسبل للمكرر لنوع صفي، ولكن هذا يلقي ClassCastException ( "java.util.HashMap $ ValueIterator لا يمكن أن يلقي لsketch_oct27a $ MyClass"). يوضح رمز مبسط التالي هذا السلوك:

import java.util.*;

void setup() {
  HashMap m = new HashMap();

  m.put("First", new MyClass());
  m.put("Second", new MyClass());
  m.put("Third", new MyClass());

  Iterator iter = m.values().iterator();

  while (iter.hasNext()) {
   ((MyClass)iter).SaySomething(); // Throws ClassCastException
   iter.next();
  }    
}

class MyClass { 
  void SaySomething() {
    println("Something");
  }
}

وكيف يمكنني استدعاء الأسلوب SaySomething () من خلال التكرار؟

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

المحلول

وهذه هي الطريقة التي تستخدم مكرر:

((MyClass)iter.next()).SaySomething();

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

HashMap<MyClass> m = new HashMap<MyClass>();
...
Iterator<MyClass> iter = m.values().iterator();
...
iter.next().SaySomething();

ويمكنك بعد ذلك حتى تخطي مكرر تماما (في الواقع، بناء الجملة هذا فقط يخفي ذلك، لا تزال تستخدم ضمنيا):

for(MyClass element : m.values())
{
    element.SaySomething();
}

نصائح أخرى

والتعليمات البرمجية يفعل ذلك حاليا:

    ((MyClass)iter).SaySomething();

وهذا يقول "يلقي iter كما مثيل MyClass واستدعاء الأسلوب SaySomething() لها، وهذا فشل لأن الطبقة الفعلية مثيل iter ستكون بعض الطبقة الداخلية التي تطبق java.util.Iterator اجهة. وهذا الطراز لا تكون فئة فرعية من MyClass.

ما عليك القيام به هو الحصول على مكرر لتقديم قيمة المقبلة، ويلقي تلك القيمة. أي بمعنى.

    ((MyClass) (iter.next())).SaySomething();

والتي يمكنك تبسيط إلى:

    ((MyClass) iter.next()).SaySomething();

وبسبب جافا مشغل الأسبقية.

يشير

و @مايكل إلى أنه إذا كنت تستخدم الأدوية يمكنك التخلص من التلبيس العلني. يمكنك تبسيط أبعد من ذلك باستخدام "الجديد" لتركيب الحلقة التي أدخلت في جاوة 5.0:

    HashMap<String, MyClass> m = new HashMap<String, MyClass>();

    m.put("First", new MyClass());
    m.put("Second", new MyClass());
    m.put("Third", new MyClass());

    for (MyClass mc : m.values()) {
        mc.SaySomething(); 
    }

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

وتحرير: إذا كنت لا تستطيع استخدام جافا 1.5 ثم كنت عالقة مع القيام بذلك بالطريقة القديمة الطراز. يبدو وكأنه "processing.org" يحتاج إلى الحصول على العمل معا. منصة 1.4.x جافا هو حقا خارج التاريخ.

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