Interface Functional interface mit mehreren Methoden

CptK

Bekanntes Mitglied
Hallo, ich habe ein Interface der Art
Java:
public interface Test<T extends AClass> {
    boolean compare(T[] lhs, T[] rhs);
   
    public static <T extends AClass> Test<T> compareAll() {
        return (T[] lhs, T[] rhs) -> {
            ....
        };
    }
}
Nun würde ich das gerne noch erweitern:
Java:
public interface Test<T extends AClass> {

    boolean compare(T[] lhs, T[] rhs);
    boolean compare(T lhs, T[] rhs);

    public static <T extends AClass> Test<T> compareAll() {
        return (T[] lhs, T[] rhs) -> {
            ....
        };
    }
   
     public static <T extends AClass> Test<T> contains() {
        return (T lhs, T[] rhs) -> {
            ....
        };
    }
}

Jetzt wird mir aber in beiden Fällen das vor dem Pfeil in der Lambda-Expression unterstrichen und es heißt "The target type of this expression must be a functional interface". Darf man sowas nicht machen, bzw wieso darf man das nicht oder mache ich da nur irgendwas falsch?
 
Zuletzt bearbeitet:
Das ist auch recht einfach erklärt, warum das nicht geht.

Deine Methode compareTo gibt eine Implementierung von test zurück, bei der aber die nur die Methode mit den beiden Array Parameters definiert ist. Was soll folgender Code machen

Java:
public class MyClass {

public void doSomething() {
  test myTest = test.compareAll();
 T lhs = ...;
 T[] rhs = ...;
  mytest.compare(lhs, rhs);
}
}
Die Rückgabe von compareAll definiert nur die Methode mit den beiden Array Parametern.. Das weiß aber der Aufrufer nicht, der kann auch die Methode aufrufen, wo nur ein Array Parameter definiert ist.


Was man machen kann, ist eine default Methode definieren - sprich, dass die compare Methode mit nur einem Array Parameter ein Array erzeugt und an die andere Methode delegiert.

PS: Klassen-Namen werden in Java groß geschrieben 🙂
 
Was man machen kann, ist eine default Methode definieren - sprich, dass die compare Methode mit nur einem Array Parameter ein Array erzeugt und an die andere Methode delegiert.

PS: Klassen-Namen werden in Java groß geschrieben 🙂
Okay, danke, dann werde ich das so machen.

Ja eigenlich sind meine Klassen auch alle groß geschrieben nur hier im Forum hat sich das mit nem Tippfehler und copy-paste dann so ergeben, ich habs aber mal korrigiert 😉
 

Zurück
Oben