لا يمكن لفئة Scala تجاوز طريقة المقارنة من Java Interface التي تمتد java.util.comparator

StackOverflow https://stackoverflow.com/questions/3329001

سؤال

أنا أعمل حاليًا على منفذ مكون jEdit الإضافي لكتابة جميع الأكواد البرمجية في Scala.ومع ذلك، فأنا مجبر في مرحلة معينة على تنفيذ أداة المقارنة الخاصة بي.

الكود المبسط الخاص بي هو كما يلي:

class compare extends MiscUtilities.Compare {
  def compare(obj1: AnyRef, obj2: AnyRef): Int = 1
}

لدى MiscUtilities.Compare التوقيع التالي عند البحث من IntelliJ

public static interface Compare extends java.util.Comparator {        
    int compare(java.lang.Object o, java.lang.Object o1);
}

ولكن عندما أحاول تجميع صفي، تظهر لي رسالة خطأ تقول:

خطأ:يجب أن تكون مقارنة الفئة مجردة، نظرًا لأن مقارنة الطريقة في مقارنة السمات من النوع (x$1:تي،س$2:t) int لم يتم تعريف الفئة المقارنة

لقد حاولت أيضًا استخدام Any وjava.lang.Object كأنواع، لكن لم يحالفني الحظ حتى الآن.

المساعدة موضع تقدير كبير :)

تحياتي ستيفان

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

المحلول

من الممكن ان تكون مستحيل.إذا كان هذا خطأ، أود أن أعرف.

يحرر:ولكن يمكنك القيام بذلك بدلاً من ذلك:

// CompareImpl.java
abstract class CompareImpl implements MiscUtilities.Compare {
  public int compare(Object o, Object o1) {
    return doCompare(o, o1);
  }

  public abstract int doCompare(Object o, Object o1);
}

// MyCompare.scala
object MyCompare extends CompareImpl {
  def doCompare(a: AnyRef, b: AnyRef) = 0
}

لذلك لا يزال يتعين عليك كتابة بعض جافا، ولكن هناك فئة تافهة واحدة فقط لكل واجهة MiscUtilities.Compare.

نصائح أخرى

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

 ~/code/scratch/raw: cat Compare.java 
interface Compare extends java.util.Comparator {
}
 ~/code/scratch/raw: cat MyCompare.scala 
object MyCompare extends Compare  {
  def compare(a: AnyRef, b: AnyRef) = 0
}
 ~/code/scratch/raw: scalac MyCompare.scala Compare.java 
MyCompare.scala:1: error: object creation impossible, since method compare in trait Comparator of type (x$1: T,x$2: T)Int is not defined
object MyCompare extends Compare  {
       ^

الإغراء هو التوسع Comparator[AnyRef] مباشرة من MyCompare, ، جنبا إلى جنب مع Compare:

object MyCompare extends java.util.Comparator[AnyRef] with Compare  {
  def compare(a: AnyRef, b: AnyRef) = 0
}

لكن هذا يؤدي إلى:

error: illegal inheritance;
 self-type MyCompare.type does not conform to java.util.Comparator[AnyRef]'s selftype java.util.Comparator[AnyRef]

لذا فإنني أميل إلى الموافقة على أن هذا غير ممكن، على الأقل بشكل مباشر.اكتب الفصل بلغة Java، وقم بتفويض Scala إذا لزم الأمر.

هل يعمل إذا وضعت [anyref] بعد miscottilities.compare؟I.E.،

giveacodicetagpre.

حاولت ذلك مع java.util.comparator مباشرة وكان المترجم سعيدا.

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