2015-07-06 8 views
5

eine generische Schnittstelle gegeben?Java Generics, Schnittstellen und Typeinschränkungen

public class Run { 

    public static void main(String[] args) { 

     A a = new A<String>("hello"); 

     System.out.println(a.interfaceMethod(100)); \\ returns 0 
    } 
} 

I erwartet, dass die T Typ-Parameter des Verfahrens wie in interfaceMethodclass A definiert die Methode Argumente zu beschränken, die denselben Typ haben, wie die an den Konstruktor A geliefert. (in diesem Fall String).

Warum benötigt a.interfaceMethod kein Argument vom Typ String?

+0

wahrscheinlich, weil ich nicht folgende eine 'A a = neue A (" Hallo ");' ... – beoliver

+0

Ich würde wagen, dass die ganze Zahl implizit in String umgewandelt wird http://StackOverflow.com/ Fragen/9159358/implizite-cast-to-string-tostring-und-int – JoSSte

+0

http://stackoverflow.com/questions/2770321/what-isa-raw-type-and-why-shouldnt-we-use-use- es –

Antwort

1

Während die anderen Antworten erklärten, dass normalerweise eine Compilerwarnung angezeigt werden sollte. Die Erklärung, die ich gesucht habe, kam in Form der link to a previous post von @JB Nizet zur Verfügung gestellt.

T t = new T<S>()

ist nicht dasselbe wie

T<S> t = new T<S>()

Das erste ist ein Beispiel für einen Typ rohen. Ich war interessiert an warum das funktioniert (d. H. Wenn es kompiliert und keinen Laufzeitfehler wirft), dann muss es etwas dabei sein.

Die Antworten auf diesen Beitrag sind detailliert und erklären genau, warum dies kompiliert (lange Geschichte kurz, Rückwärtskompatibilität). Der Beitrag geht ins Detail und erklärt die Implikationen für Javas Typsystem.

1

Das geschieht, weil Sie die Warnung „Raw Verwendung von Parameter a“ (oder so ähnlich) ignoriert

Verwendung:

A<String> a = new A<String>("hello"); 

Wenn kann der Code generische ähnliche Warnungen ignorieren kompilieren, wenn nicht sollte .

+0

Es gab keine Warnungen ... Oder sind diese java-docs Warnungen? – beoliver

+0

Wenn Sie intellij/eclipse verwenden, sollten Sie die Warnungen sehen, sofern sie nicht deaktiviert sind. – BobTheBuilder

+0

Es gibt definitiv eine Warnung: * Run.java verwendet nicht markierte oder unsichere Operationen. Kompilieren Sie mit -Xlint: unchecked für Details. * –

1

Dies funktioniert, weil a Instanz A Klasse typisiert ist nur
Sie sollten es so ein:

A<String> a = new A<String>("hello"); 

Wenn Sie nicht den Parameter angeben, werden Sie in der Lage sein, dort zu setzen alle Datentypen wie String , int usw.

+0

Sie haben Recht, @JBNizet, entfernt – maskacovnik

+0

Sorry, sah es und jetzt verbessert @JBNizet – maskacovnik