سؤال

تحرير:وقد اتضح أن هذا ليس مشكلة مع رمز في كل شيء ، ولكن مع وجود خلل في رائع الكسوف المساعد (http://jira.codehaus.org/browse/GRECLIPSE-373)

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

public interface InterfaceA<T> {
    T getData();
}

واحدة من تطبيقات يبدو مثل هذا:

public class Impl<T extends AnotherClass> implements InterfaceA<Collection<T>> {
    public Collection<T> getData() {
       // get the data
    }
}

هناك أيضا وعاء على InterfaceA

public class Container<T extends InterfaceA>
{
    private T a;

    public Container(T a) {
        this.a = a;
    }

    public T getA() {
        return a;
    }
}

القيام بذلك يسبب "getData غامضة" خطأ.

Container<Impl<AnotherClass>> c = new Container(new Impl<AnotherClass>());
Collection<AnotherClass> coll = c.getA().getData();

أنا الحيرة على هذا واحد.

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

المحلول

ويبدو أن هناك خلل تسبب هذا من المساعد رائع. http://jira.codehaus.org/browse/GRECLIPSE-373 . وهي ليست مشكلة جافا على الإطلاق. شكرا للمساعدة واعتذاري.

نصائح أخرى

Collection<T> getData() المحددة في Impl يحتاج إلى أن يتم العامة.إذا كنت تفعل هذا الكود برمجيا نظيفة بالنسبة لي.

وكما قال غيرها من الملصقات، وأنا لا أرى هذه المشكلة على الكسوف 3.5.0 يعمل على JDK 1.6.0.14 (عند تحديد انخفاض الرؤية للطريقة getData()).

وأقترح القيام إنشاء نظيف (مشروع / تنظيف في الكسوف). أيضا، النسخة الكسوف وجافا كنت تقوم بتشغيل قد يساعد.

و- Flaviu Cipcigan

والمثال تم تحريرها يعمل بشكل جيد بالنسبة لي (JDK 1.5) مع استثناء، التي لديك لتحديد نوع عام على المنشئ. هنا هو قانون بلدي استكمال العمل:

public interface InterfaceA<T> {
    T getData();
}

public static class Impl<T extends Date> implements InterfaceA<Collection<T>> {
    public Collection<T> getData() {
        return null;
    }
}

public static class Container<T extends InterfaceA> {
    private T a;

    public Container(T a) {
        this.a = a;
    }

    public T getA() {
        return a;
    }

}

public static void main(String[] args) {
    Container<Impl<Date>> c = new Container<Impl<Date>>(new Impl<Date>());
    Collection<Date> coll = c.getA().getData();
}

[تحرير تعكس تحديث مسألة]

هذا لا ينبغي حتى جمع كما كنت يقلل من وضوح الأسلوب من العام إلى حزمة النطاق:

public class Impl<T extends AnotherClass> implements InterfaceA<Collection<T>> {
    Collection<T> getData() {
       // get the data
    }
}

و هذا لا يزال يجمع بالنسبة لي (Eclispe 3.4 ، OS X 1.5), لذلك لا أعرف ما هو بالضبط المشكلة:

حزمة درجة الحرارة.الاختبارات ؛

import java.util.Collection;

public interface InterfaceA <T> {

    T getData();

    public static final class AnotherClass {}

    public static final class Impl<T extends AnotherClass> 
             implements InterfaceA<Collection<T>>
   {
        public Collection<T> getData () {
            return null;
        }
    }

    public static class Container<T extends InterfaceA>
    {
        private T a;
        public Container(T a) { this.a = a; }
        public T getA() { return a; }
    }

    public static final class Test {
        public static void main (String[] args) {
            Container<Impl<AnotherClass>> c = new Container(new Impl<AnotherClass>());
            Collection<AnotherClass> coll = c.getA().getData();
        }
    }
}

وماذا لديك هنا يبدو مشروعا. ربما الكسوف يظهر خطأ فإنه لا ينبغي على خلاف ذلك.

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

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

Container<Impl<Date>> c = new Container<Impl<Date>>(new Impl<Date>());

و(في بلدي على سبيل المثال، أنا باستخدام java.util.Date كما هو الحال في مكان "AnotherClass ').

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