سؤال

لدي مفهوم NodeTypeرمل Nodeس.أ NodeType عبارة عن مجموعة من البيانات الوصفية التي يمكنك إنشاؤها Node مثيلات من (تشبه إلى حد كبير علاقة الفئة/الكائن بأكملها).

لدي مختلف NodeType التطبيقات وتطبيقات العقدة المختلفة.

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

public abstract class AbstractNodeType {
  // ..

  public abstract <T extends AbstractNode> T createInstance();
}

في NodeType التطبيقات أقوم بتنفيذ الطريقة مثل هذا:

public class ThingType {
  // ..

  public Thing createInstance() {
    return new Thing(/* .. */);
  }
}

// FYI
public class Thing extends AbstractNode { /* .. */ }

وهذا كله جيد وجيد، ولكن public Thing createInstance() ينشئ تحذيرًا حول سلامة النوع.خاصة:

نوع السلامة:يحتاج نوع الإرجاع لـ CreateInstance () من النوع Thingtype إلى تحويل غير محدد ليتوافق مع t من النوع الملخص nodeType

ما الخطأ الذي أفعله لتسبب مثل هذا التحذير؟

كيف يمكنني إعادة صياغة الكود الخاص بي لإصلاح هذا؟

@SuppressWarnings("unchecked") ليس جيدًا، أرغب في إصلاح ذلك عن طريق ترميزه بشكل صحيح، وعدم تجاهل المشكلة!

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

المحلول

يمكنك فقط استبدال <T extends AbstractNode> T مع AbstractNode بفضل سحر العوائد المتغيرة. Java 5 أضاف الدعم، لكنه لم يحصل على الحانة التي يستحقها.

نصائح أخرى

بطريقتين:

(أ) لا تستخدم الأدوية الجنيسة.ربما ليس من الضروري في هذه الحالة.(على الرغم من أن ذلك يعتمد على الرمز الذي لم تعرضه.)

(ب) إنشاء AbstractNodeType كما يلي:

public abstract class AbstractNodeType<T extends AbstractNode> {
  public abstract T createInstance();
}
public class ThingType<Thing> {
  public Thing createInstance() {
    return new Thing(...);
  }
}

شيء من هذا القبيل يجب أن يعمل:

interface Node{
}
interface NodeType<T extends Node>{
    T createInstance();
}
class Thing implements Node{}
class ThingType implements NodeType<Thing>{
    public Thing createInstance() {
        return new Thing();
    }
}
class UberThing extends Thing{}
class UberThingType extends ThingType{
    @Override
    public UberThing createInstance() {
        return new UberThing();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top