سؤال

لدي عام رد الكائن الذي يوفر (البدائية) رد القدرة على جافا ، في غياب الإغلاق.رد كائن يحتوي على طريقة و ترجع المعلمة والعودة أنواع الأسلوب عبر بضعة accessor الأساليب التي مندوب فقط إلى ما يعادل الطرق في الأسلوب.

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

static public void checkFunctionSpec(Callback cbk) {
    Class[]                             prms=cbk.getParmTypes();
    Class                               ret =cbk.getReturnType();

    if(!Number.class.isAssignableFrom(ret)) {
        throw new IllegalArgumentException(
           "A function callback must return a Number type " + 
           "(any Number object or numeric primitive) - function '" +
           cbk + "' is not permitted");
        }
    for(Class prm: prms) {
        if(!Double.class.isAssignableFrom(prm)) {
            throw new IllegalArgumentException(
               "A function callback must take parameters of " +
               "assignment compatible with double " +
               "(a Double or Float object or a double or float primitive) " +
               "- function '" + cbk + "' is not permitted");
            }
        }
    }

المشكلة التي أواجهها هي أن عندما حاول هذا مع مثلالرياضيات.abs () ، هو رمي استثناء من أجل عودة نوع على النحو التالي:

java.lang.IllegalArgumentException:
A function callback must return a Number type (any Number object or numeric primitive)
- function 'public static double java.lang.Math.abs(double)' is not permitted

هذا كان مفاجئا بالنسبة لي لأنني المتوقع الأوليات ببساطة العمل (أ) لأنها تنعكس باستخدام فئات المجمع ، و (ب) مزدوجة.نوع أعلن أن تكون من نوع الدرجة<Double>.

لا أحد يعرف كيف يمكن تحقيق هذا دون تعديل الشيك إلى:

if(!Number.class.isAssignableFrom(ret)
     && ret!=Double.TYPE
     && ret!=Float.TYPE
     && ret!=...) {

التوضيح

عند استدعاء الأسلوب double abs(double) باستخدام الأسلوب.الاحتجاج(), تمر في وجوه[]{ضعف} والعودة مزدوجة.ومع ذلك ، إثباتي يبدو أن الفشل بسبب ضعف.نوع لا تنازل مزدوجة.منذ أن تتطلب كل هذه الاسترجاعات للعودة نوعا من العدد الذي سيتم إرجاع طريق استدعاء() وعدد أنا أحاول التحقق من أن الموردة الأسلوب بإرجاع إما رقم أو رقمية بدائية.

التحقق من parms أيضا.

وبعبارة أخرى, عند استخدام انعكاس بارما والعودة أنواع مزدوج متطابقة وأود التحقق من صحة بسهولة على هذا النحو.

تحرير:زيادة توضيح:أريد التحقق من صحة هذا الأسلوب عندما الاحتجاج() ويسمى العودة كائن من نوع رقم (التي يمكن أن أدعو الكائنات.doubleValue() للحصول على ضعف أريد).

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

المحلول

وتبحث عن كثب في وثائق Class.isAssignableFrom ()، فإنه ينص تحديدا على أن أنواع لبدائية لا تطابق أي فئة إلا أنفسهم. ولذا فإنني سوف تحتاج إلى التحقق على وجه التحديد من أجل المساواة == لByte.TYPE، Double.TYPE، Float.TYPE، Integer.TYPE، Long.TYPE، وShort.TYPE لنوع الإرجاع.

نصائح أخرى

لماذا لا يكون مترجم تفعل ذلك ؟

public interface F<A, B> {
   public B $(A a);
}

ثم يمكنك تمرير F<Double, Double> أن الأسلوب الذي يتوقع F<? extends Number, ? extends Number>.

تحرير:

يقول لك هل ترغب في توفير فئة واحدة لنوع من وظيفة مع أي عدد من الحجج.هذا يمكن ينبغي القيام به مع جافا نوع النظام.من الناحية النظرية كل وظيفة لديها سوى حجة واحدة.وظيفة مع اثنين من الحجج ما يعادل الدالة التي ترجع وظيفة أخرى.حتى هنا هو متغير القيمة التي هي وظيفة أن يأخذ اثنين الزوجي:

F<Double, F<Double, Double>> f;

هنا هو الطريقة التي يمر اثنين الزوجي إلى وظيفة معينة:

public Double operate(F<Double, F<Double, Double>> f, double a, double b) {
   return f.$(a).$(b);
}

أو النظر في نوع L<A extends L> مع اثنين من الفئات الفرعية C<E, T extends L<T>> يمثل "سلبيات" ، المنهي نوع N:

public abstract class L<A extends L<A>> {  
 private L() {}  

 private static final N nil = new N();  

 public static N nil() {  
   return nil;  
 }  

 public static final class N extends L<N> {  
   private N() {}  

   public <E> C<E, N> cons(final E e) {  
     return new C<E, L>(e, this);  
   }  
 }  

 public static final class C<E, L extends L<L>> extends L<C<E, L>> {  
   private E e;  
   private L l;  

   private C(final E e, final L l) {  
     this.e = e;  
     this.l = l;  
   }  

   public E head() {  
     return e;  
   }  

   public L tail() {  
     return l;  
   }  

   public <E> C<E, C<E, L>> cons(final E e) {
     return new C<E, C<E, L>>(e, this);
   }  
 }  

}  

في مثل هذه الحالة ، يمكنك تنفيذ دالة اكتب هكذا:

public interface F<A extends L<A>, B> {
   public B $(A args);
}

الطريقة التالية تتوقع وظيفة مع اثنين Double الحجج (وإرجاع Double) ، جنبا إلى جنب مع اثنين من doubles لتطبيقه:

public Double operate(F<C<Double, C<Double, N>>, Double> f, double a, double b) {
   return f.$(N.nil().cons(b).cons(a));
}

تنفيذ F واجهة سوف تضطر إلى الحصول على حجج من القائمة باستخدام head و tail.حتى في الواقع, انت تنفيذ اللثغة في جاوة.:)

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

والمعلمة لMath.abs () هو ضعف بدائية. أنا لست متأكدا تماما ما تعنيه كائن بدائي "مهمة متوافقة" مع كائن (ما يعني API التفكير أساسا هو "يمكن أن يكون المدلى بها من"). ولكن إذا كنت تقصد "يمكن أن تنتقل إلى منشئ مزدوج"، ثم وهذا هو في الأساس ضعف بدائية (أو سلسلة) !! ربما تحتاج إلى توضيح أكثر قليلا ما عليك القيام به؟

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