Frage Was ist falsch an dieser Java-generischen Methodensyntax?


Ich habe die folgenden Klassen

KeyValue.java

package test;

public class KeyValue<T> {
    private String key;

    private T value;

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }

}

Leser.java

package test;

public interface Reader<T> {
    <S extends T> S read(Class<S> clazz);
}

Test.java

package test;

import java.util.List;

public class Test {

    public static void main(String[] args) {
        List<KeyValue<Object>> list = find(KeyValue.class, new Reader<KeyValue<Object>>() {

            @Override
            public <S extends KeyValue<Object>> S read(Class<S> clazz) {
                return null;
            }
        });
    }

    public static <T> List<T> find(Class<T> targetClass, Reader<T> reader) {
        return null;
    }

}

Hier der Methodenaufruf find(......) Fehler beim Kompilieren mit Fehlermeldung

Die Methode find (Class, Reader) im Typ Test ist nicht anwendbar für die Argumente (Klasse, neuer Reader> () {}).

Diese Methode muss das Objekt vom Typ zurückgeben List<KeyValue<Object>>.

Was ist falsch an diesem Design und wie kann man das beheben?

Vielen Dank.


6
2018-05-13 07:38


Ursprung


Antworten:


finddefiniert T und T (im ersten und zweiten Argument) als vom selben Typ - Ihr Aufruf an find verwendet den Typ Object in der ersten arg und der Art KeyValue<Object>im zweiten arg.

Verwenden Sie entweder zwei verschiedene Typkennungen (z. B. T und X, d. H. public static <T, X extends T> List<T> find(Class<T> targetClass, List<X> reader)  ) in deinem find Erklärung oder reparieren Sie Ihren Anruf an find.


2
2018-05-13 07:43



Sie möchten eine Liste Ihrer Klasse KeyValue von Ihrer Methode finden aber Sie haben es als Liste definiert. Beachten Sie, dass es sich um eine Liste von T nicht KeyValue handelt Ändern Sie Ihre Methodendeklaration wie folgt

private static <T> List<KeyValue<T> > find(Class<KeyValue> aClass, Reader<KeyValue<T> > reader) {
    throw new UnsupportedOperationException("Not yet implemented");
}

Ich denke, das ist was du willst


1
2018-05-13 08:11



Versuche zu deklarieren Test wie

public class Test<T> {.


-1
2018-05-13 07:40