سؤال

لدينا بعض اختبارات الوحدات التي تجميعها وتشغيلها بشكل جيد في Eclipse 3.4، ولكن عندما نحاول تجميعها باستخدام Javac، فإنه يفشل. لقد تمكنت من خفض التعليمات البرمجية إلى شيء صغير ومكتب ذاتيا، لذلك لا يوجد لديه تبعيات خارجية. لن يؤدي الكود نفسه إلى معنى كبير لأن كل شيء خارج السياق، لكن هذا لا يهم - أريد فقط معرفة سبب عدم إعجاب Javac بهذا:

public class Test {

    public void test() {
        matchOn(someMatcher().with(anotherMatcher()));
    }

    void matchOn(SubMatcher matcher) {}

    SubMatcher someMatcher() {
        return new SubMatcher();
    }

    Matcher anotherMatcher() {
        return null;
    }
}

interface Matcher <U, T> {}

class BaseMatcher implements Matcher {
    public BaseMatcher with(Matcher<?,?> matcher) {
        return this;
    }
}

class SubMatcher extends BaseMatcher {
    @Override
    public SubMatcher with(Matcher matcher) {
        return this;
    }
}

لقد حاولت مع JDK 1.5.0_10 و 1.6.0_13, مع نفس النتيجة:

Test.java:6: matchOn(test.SubMatcher) in test.Test cannot be applied to (test.BaseMatcher)
                matchOn(someMatcher().with(anotherMatcher()));
                ^
1 error

أعتقد أن هذا هو جافا صالحة تماما. تتم إرجاع الأسلوب REMUCTAGHER.WITH نوعا أكثر تحديدا من BaseMatcher.With ()، ولكن يبدو أن المحول البرمجي يعتقد أن نوع الإرجاع هو basematcher. ومع ذلك، من الممكن أن يكون برنامج التحويل البرمجي الكسيف يسمح بشيء لا ينبغي أن يكون عليه.

أيه أفكار؟

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

المحلول

في BaseMatcher تحتاج إلى تحديد معلمات النوع:

public SubMatcher with(Matcher<?, ?> matcher) {

من أجل السماح Javac بمطابقة الخاص بك with طريقة

ملاحظة

IMHO هو علة من مترجم الكسوف

نصائح أخرى

أنا جعلت بناء بنجاح عن طريق إضافة <?,?> ل Matcher في SubMatcher.with:

class SubMatcher extends BaseMatcher {
    @Override
    public SubMatcher with(Matcher<?,?> matcher) {
        return this;
    }
}

بدون هذا، يختلف توقيع الطريقة عن القاعدة. أتساءل ما إذا كان هناك خطأ في @Override التحقق من فشل في ملاحظة هذا.

تحقق من jre أو jdk التي تتجمعها على كلا الكسوف والمحطة. ربما قد تكون مشكلة الإصدار.

تناسبني:

$ Java -version OpenJDK الإصدار "1.7.0-داخلي" بيئة وقت التشغيل OpenJDK (بناء 1.7.0-Internal - **** - 2009_07_23_10_21-b00) OpenJDK خادم 64 بت خادم VM (بناء 16.0-B06، الوضع المختلط) $ Javac -xdrawdiagnostics Test.java $

أتذكر غامضة مثل هذا البغرة، ولكن لا يمكن أن تعطيك رابطا إليه الآن.

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