unbekanntes Generic

  • Themenstarter Themenstarter Gast
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Morgen,

hab gerade eine Deklaration einer Methode gesehen, mit der ihc nicht sehr viel anfangen kann, und zwasr

Code:
static <S> ServiceLoader<S> load(Class<S> service, ClassLoader loader)

static ist mir klar-> Klassenmethode
das aleinstehende <S> irritiert mich ein bisschen, mit dem kann ich nichts anfangen, und das Class<S> ist mir auch nicht ganz klar,
 
Moment mal..

der Rückgabewert sollte doch ServiceLoader<S> sein, oder stehe ich jetzt auf dem Schlauch?
Was macht dieses <S> da???
 
maki hat gesagt.:
Was macht dieses <S> da???

Damit spezifizierst Du den Typparameter der Methode. Klarer wirds bei sowas:

Code:
public <T extends Foobar> T toFoobar() { ... };

Benutzt man nur Typparameter, die schon durch die Klasse spezifiziert sind, dann braucht man das nicht bei der Methode angeben.
 
Das heißt dann quasi, dass man nur FooBar oder eine Subklasse von FooBar returnen kann,
 
In diesem Fall, ja. Auf jeden Fall muss jeder Typparameter irgendwo definiert sein, entweder für die gesamte Klasse (class Foobar<T>) oder für eine Methode (public <T> void foobar(T arg)).
 
Das alleingestellte <S> kann man bei statischen Methoden verwenden, um dem Typ festzulegen. Sinngemäß (und NUR zur Verdeutlichung!!!) schreibt man bei statischen Methoden eben nicht
Code:
class Foo<S>
{
    static S getSomething();
}
(was nichts bringen würde, weil man ja nicht ein "new Foo<String>" erstellen will, nur um die (statische) Methode für Strings aufrufen zu können) sondern eben
Code:
class Foo
{
    static <S> S getSomething();
}
 
Das trifft nicht nur auf statische Methoden zu. Du kannst auch in ganz normalen Objekten (nicht statische) Methoden parametrisieren mit Typen, die nicht für die gesamte Klasse definiert sind.
Wichtig ist einfach nur, dass die Typen irgendwo definiert werden, entweder für die gesamte Klasse oder für eine Methode.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben