2013-05-12 13 views
5

Lassen Sie uns sagen, ich habe eine Schnittstelle A mit generischen Typ:eine generische Schnittstelle ohne Typ-Parameter

public interface A<T> { 
    T getT(); 
} 

und eine Klasse B es Implementierung:

public class B implements A { 
    public Integer getT() { return 1; } 
} 

... aber ohne geben ihm eine Typ Parameter.

Was passiert hier? Geht die A auf A<Integer> zurück? Ist es möglich, den Benutzer zu zwingen, den Typ-Parameter mit implements Anweisung (wie B implements A<Integer>) zu schreiben?

+0

@ johnchen902 Ich dachte, du würdest in eine rassistische Tirade einbrechen, als ich das "a" vor "Chinesisch" sah, bevor ich merkte, dass du Chinese bist: P – christopher

+0

@ johnchen902 es ist ziemlich off-topic: p Ja, taiwanesisch genau. In der Tat ging ich auf die gleiche Schule wie deine. –

Antwort

4

Ihre Frage implementiert:

Wh bei passiert hier?

Da Sie den generischen Typ weggelassen haben, hat das System es als Object gewertet.Sie könnten die folgenden mit den gleichen Ergebnissen durchgeführt:

public class B implements A<Object> { 
     ... 
    } 

Nächste Frage:

Ist es möglich, Benutzer zu zwingen, Typparameter mit Geräten zu schreiben (wie B implementiert A)

Ja. Dies ist wie:

interface A<T extends Integer> 

Hoffe, das hilft.

+2

Endgültige Angabe: 'öffentliche Ganzzahl getT() ...' in obigem, wo "T" ist "Objekt", arbeitet wegen [kovariante Rückgabetypen] (http://docs.oracle.com/javase/tutorial/java/javaOO/returnvalue.html) –

1

Was passiert hier?

Nun, da Sie die Schnittstellenimplementierung als Raw-Typ verlassen haben, muss der Rückgabetyp vom Typ Object sein. Es leitet nicht den Rückgabetyp ab, aber wenn Ihr Rückgabetyp vom Typ Object ist, was jedes einzelne Objekt in Java ist, dann wird es funktionieren.

Ist es möglich, Benutzer zu zwingen, Typ Parameter mit implementiert zu schreiben (wie B implementiert A)?

Erzwingen Sie den Benutzer, es einzugeben? Computer sind mächtig, aber Gedankenkontrolle ist noch ein bisschen weit weg.

+0

Ich möchte nicht die Gedanken der Nutzer kontrollieren haha. Was ich meinte ist, dass ich Benutzer dazu zwingen kann, einen Typ zu geben, der "Foo" um "Interface A " erweitert. –

1

Nun, der „richtige“ Weg Klasse zu implementieren B ist:

public class B implements A<Integer> { 
    @Override 
    public Integer getT() { 
     return 1; 
    } 
} 

Nachdem Sie die Klasse schreiben B diese Weise können Sie Benutzer erzwingen nur diese Klasse mit Integer Typ zu verwenden. Wenn der Generics Specifier fehlt (wie in Ihrem Beispiel), wird der Code kompiliert (weil Generics Löschungen sind), aber die meisten IDEs erzeugen Warnungen (zB in Eclipse ist die Warnung "A ist ein Rohtyp. Verweise auf generischen Typ A ? sollte B.java“

-1

parametrieren Was hier passiert, Nun, da Integer-Objekt erweitert, so dass es gut funktionieren wird, schlagen Sie Parameter hinzufügen, mit

+0

"Es wird gut funktionieren" - aber 'B' ist ein' A' anstelle von 'A ', was einige Auswirkungen hat. –

+0

ändere es zu A duplicatedcode

+0

Uh, ich bin nicht der OP, aber das antwortet nicht "Was passiert hier?" sowieso. –

Verwandte Themen