2016-05-23 3 views
1

Ich bin relativ Anfänger Anfänger Kenntnisse in Advanced Java Generics skaliert. Ich wollte eine Schnittstelle so etwas wie dieseDefinieren Sie eine Schnittstelle mit mehreren gebundenen Typen von Java Generics

public interface Transformer { 
<T extends String & List<String>> T transform(String input) throws    
    IOException; 
} 

Meine Implementierung der Klasse A definieren, wie unten dargestellt:

public Class A implements Transformer{ 
    .... 
    .... 

    @Override 
    public <T extends String & List<String>> T transform(String input)  throws IOException { 
    String response = "a"; 
    return response; // compilation error "Incompatible Types: Required T but found java.lang.String" 
    } 

} 

Was ich haben will: Die Umsetzung Klasse in der Lage sein sollte, einen String-Eingang passieren und Rückgabetyp kann String oder eine Liste sein. Die Implementierungsklasse hat völlig die Freiheit, einen der Rückgabetypen zu wählen.

Frage: 1. Warum wird der Kompilierungsfehler "Inkompatible Typen: Erforderlich T aber gefunden java.lang.String" angezeigt?

+0

Der Rückgabewert der Transformationsmethode muss einen String erweitern (den es seit String nicht final ist) und die List Schnittstelle implementieren. Ich bezweifle stark das ist etwas, das du wolltest ... du solltest deine Frage so umformulieren, dass dein Ziel klar ist ... –

Antwort

2

Ich denke, Sie haben Kreuzungstypen falsch verstanden.

Die Definition Sie haben bedeutet: T ist ein String andList<String> und nicht String ORList<String>, was nicht möglich ist, weil String kein List<String> ist und nichts kann einen String und List<String> verlängern, weil Stringfinal ist.

Eine solche Definition ist sinnvoll, wenn Sie eine Schnittstelle zwischen zwei Schnittstellen haben, weil Java die Vererbung mehrerer Schnittstellen oder eine Implementierung und mehrere Schnittstellen unterstützt, da eine Klasse eine andere Implementierung erweitern und mehrere Schnittstellen implementieren kann.

Da ein List<String> null oder mehr Strings haben kann, können Sie Ihre Methode einfach List<String> zurückgeben.

+0

Schätze für deine Antwort. Ich habe deine Antwort verstanden. Ich habe tatsächlich versucht zu sehen, ob Java Generics eine Option zur Unterstützung wie T extends String oder List hat. Es könnte dumm sein, sich aber die Dokumente und Tutorials anzusehen. Wie umgehen Sie das Definieren einer Schnittstelle, die String-Eingaben akzeptiert und eine Antwort vom Typ String oder Collection zurückgibt? – saripallivskp

+0

@saripallivskp Wie gesagt, eine Collection kann null oder mehr Werte haben. –