2017-02-20 2 views
1

Ich habe die unten Testklasse in meinem Java-Code zu erstellen:Java - Fehler eine funktionale Schnittstelle mit einem

Function<? super Either<? extends Object, ? extends Object>, ? super Either<? extends Object, ? extends Object>> test = new Function<Either<Integer, Integer>, Either<Integer, Integer>>() { 
     @Override 
     public Either<Integer, Integer> apply(Either<Integer, Integer> integers) { 
      return integers; 
     } 
} 

Dokumentation zu finden sie hier: http://static.javadoc.io/io.javaslang/javaslang/2.0.2/javaslang/control/Either.html.

Aber ich bekomme die folgenden Compiler-Fehler (Java 8)

Error:(77, 129) java: incompatible types: 
<anonymous java.util.function.Function<javaslang.control.Either<java.lang.Integer,java.lang.Integer>,javaslang.control.Either<java.lang.Integer,java.lang.Integer>>> 
cannot be converted to 
java.util.function.Function<? super javaslang.control.Either<? extends java.lang.Object,? extends java.lang.Object>,? super javaslang.control.Either<? extends java.lang.Object,? extends java.lang.Object>> 

Ich bin neu in Java und bin nicht sicher, was hier nicht stimmt. Jede Hilfe wird sehr geschätzt.

Ich verstehe diesen Code macht keinen Sinn und das ist nicht, wie ich es wirklich benutze. Ich versuche tatsächlich, eine Funktion an eine interne Bibliothek zu übergeben. Aber ich sollte diesen Kompilierfehler nicht bekommen, wo entweder nicht konvertiert werden kann? super Entweder

Danke !!

+4

Sie sind neu in Java, aber Sie versuchen, Generika auf eine sehr fortgeschrittene Art und Weise zu verwenden; mein Vorschlag: Geh zurück und schau in die Dinge hinein, mit denen Neulinge in der Java-Sprache anfangen würden ;-) – GhostCat

+1

Tipp: '? extends Objekt ist gleichbedeutend mit "?". – shmosel

+0

Warum deklarieren Sie Ihre Variable nicht einfach als den von Ihnen erstellten Typ? I.e. 'Funktion , Entweder >' – Andreas

Antwort

0

Der Grund ist es nicht der Fall funktioniert, weil ? super Either<? extends Object, ? extends Object> (die ? super Either<?, ?> entspricht) in der Lage sein muss, jede Art von Either zu akzeptieren. Zum Beispiel müssen die folgenden kompilieren

Either<Long, Long> either = ... 
test.apply(either); 

seit Either<Long, Long> eine Unterklasse von Either<?, ?> ist. Ihre Implementierung kann jedoch nur einen bestimmten Subtyp verarbeiten: Either<Integer, Integer>.

Hier ist ein einfacher Demonstration des gleichen Problems:

Lis<? super Number> numbers = new ArrayList<Integer>(); 

Diese nicht kompilieren, weil die Liste von einem Typ sein muss, die jedeNumber annehmen können, nicht nur Integer.

Die ideale Lösung für Ihren Fall hängt davon ab, was genau Sie versuchen, was aus der Frage nicht ganz klar ist. Die nächstgelegene ich zu Ihrem Versuch, bekommen kann, ist dies:

Function<? super Either<Integer, Integer>, ? extends Either<?, ?>> test = ... 

Beachten Sie die Verwendung von super im ersten Parameter und extends im zweiten Parameter. Dies folgt dem Prinzip Producer extends, Consumer super.

Verwandte Themen