سؤال

أنا أستخدم شجرة العودية لهواتف الحاشاب، على وجه التحديد خريطة Hashmap حيث الكائن هو مرجع إلى Hashmap آخر وهلم جرا. سيتم تمرير هذا حول خوارزمية متكررة:

foo(String filename, Hashmap<String, Object> map)
{
    //some stuff here
    for (Entry<String, Object> entry : map.entrySet()) 
    {
       //type warning that must be suppressed
       foo(entry.getKey(), (HashMap<String, Object>)entry.getValue());
    }
}

أعرف تماما Object هو من النوع Hashmap<String, Object> لكنني أغضب أنني يجب أن أقمع التحذير باستخدام @SuppressWarnings("unchecked").

سأكون راضيا عن حل يفعل إما assert(/*entry.getValue() is of type HashMap<String, Object>*/) أو يلقي استثناء عندما لا يكون كذلك. ذهبت إلى أسفل طريق Generic Compile Type Safety وإذا قمع التحذير، فه يهزم الغرض.

شكرا لتعليقاتك، KSB

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

المحلول

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

public <T extends Map<String, T>> void foo(String filename, T map) {
    //some stuff here
    for (Map.Entry<String, T> entry : map.entrySet())  {
        foo(entry.getKey(), entry.getValue());
    }
}

يجب أن تجميع غرامة دون أي تحذيرات.

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

public class Node {
    private Map<String, Node> children;

    ...
    // accessor methods to retrieve children ...
}

و لدي foo أجر Node كما حجتها الثانية بدلا من ذلك. مجرد اقتراح.

نصائح أخرى

يمكنك استخدام هذه الفئة بدلا من hashmap:

public class RecursiveHashMap extends HashMap<String,RecursiveHashMap>
{
}

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

أقترح استخدام النمط المركب (انظر ويكيبيديا)، رمز مبسط:

abstract class Node
{
  String filename;
  Node( String filename ) { this.filename = filename; }
  abstract foo();
}

class FileNode implements Node
{
  FileNode( String filename ) { super(filename); }
  foo() { ... }
}

class DirectoryNode implements Node 
{
  Set<Node> children;
  DirectoryNode( String filename, Set<Node> children )
  {
    super(filename);
    this.children = children;
  }
  foo()
  {
    for ( Node child : children ) child.foo();
  }
}

HASHMAP كنت تستخدم الغازية أسفل إلى مجموعة تظهر في الدليل.

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